waitless-api 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ads/AdPlayer.d.ts +62 -0
- package/dist/core.d.ts +132 -0
- package/dist/games/base.d.ts +54 -0
- package/dist/games/breakout.d.ts +45 -0
- package/dist/games/index.d.ts +11 -0
- package/dist/games/snake.d.ts +40 -0
- package/dist/games/tetris.d.ts +94 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.esm.js +1956 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.d.ts +30 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/games/base.ts","../src/games/tetris.ts","../src/games/snake.ts","../src/games/breakout.ts","../src/games/index.ts","../src/utils/index.ts","../src/ads/AdPlayer.ts","../src/core.ts"],"sourcesContent":["import { ThemeType } from '../core';\n\nexport interface GameConfig {\n container: HTMLElement;\n theme?: ThemeType;\n onScore?: (score: number) => void;\n /** Backend/sync: dimensions and speed */\n width?: number;\n height?: number;\n speed?: number;\n /** Game-specific (Tetris: blockSize, scoring; Snake: gridSize, foodValue; Breakout: paddleWidth, brickRows, ballSpeed) */\n [key: string]: any;\n}\n\n/**\n * Base game class with common functionality\n */\nexport abstract class BaseGame {\n protected container: HTMLElement;\n protected theme: ThemeType;\n protected isRunning: boolean = false;\n protected score: number = 0;\n protected onScoreCallback?: (score: number) => void;\n \n constructor(config: GameConfig) {\n this.container = config.container;\n this.theme = config.theme || 'default';\n this.onScoreCallback = config.onScore;\n }\n \n /**\n * Start the game\n */\n abstract start(): void;\n \n /**\n * Pause the game\n */\n abstract pause(): void;\n \n /**\n * Resume the game\n */\n abstract resume(): void;\n \n /**\n * Destroy the game and clean up\n */\n abstract destroy(): void;\n \n /**\n * Update the score and trigger callback\n * @param points Points to add to the score\n */\n protected updateScore(points: number): void {\n this.score += points;\n \n // Call score callback if provided\n if (this.onScoreCallback && typeof this.onScoreCallback === 'function') {\n this.onScoreCallback(this.score);\n }\n }\n \n /**\n * Get the current score\n * @returns Current score\n */\n getScore(): number {\n return this.score;\n }\n \n /**\n * Check if the game is currently running\n * @returns Whether the game is running\n */\n isActive(): boolean {\n return this.isRunning;\n }\n} ","import { BaseGame, GameConfig } from './base';\n\n/**\n * Tetris game implementation\n */\nexport default class TetrisGame extends BaseGame {\n // Game canvas and context\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n \n // Game state\n private grid: number[][] = [];\n private currentPiece: any = null;\n private nextPiece: any = null;\n private animationFrame: number | null = null;\n private lastTime: number = 0;\n private dropInterval: number = 1000;\n private dropCounter: number = 0;\n \n // Game dimensions (from config or defaults)\n private cols: number;\n private rows: number;\n private blockSize: number;\n private scoring: { singleLine: number; doubleLine: number; tripleLine: number; tetris: number };\n \n // Tetromino shapes and colors\n private readonly shapes = [\n // I-piece\n [\n [0, 0, 0, 0],\n [1, 1, 1, 1],\n [0, 0, 0, 0],\n [0, 0, 0, 0]\n ],\n // J-piece\n [\n [2, 0, 0],\n [2, 2, 2],\n [0, 0, 0]\n ],\n // L-piece\n [\n [0, 0, 3],\n [3, 3, 3],\n [0, 0, 0]\n ],\n // O-piece\n [\n [4, 4],\n [4, 4]\n ],\n // S-piece\n [\n [0, 5, 5],\n [5, 5, 0],\n [0, 0, 0]\n ],\n // T-piece\n [\n [0, 6, 0],\n [6, 6, 6],\n [0, 0, 0]\n ],\n // Z-piece\n [\n [7, 7, 0],\n [0, 7, 7],\n [0, 0, 0]\n ]\n ];\n \n private readonly colors = [\n 'transparent',\n '#00FFFF', // I-piece (cyan)\n '#0000FF', // J-piece (blue)\n '#FF8000', // L-piece (orange)\n '#FFFF00', // O-piece (yellow)\n '#00FF00', // S-piece (green)\n '#8000FF', // T-piece (purple)\n '#FF0000' // Z-piece (red)\n ];\n \n constructor(config: GameConfig) {\n super(config);\n\n this.blockSize = typeof config.blockSize === 'number' ? config.blockSize : 30;\n const width = typeof config.width === 'number' ? config.width : 300;\n const height = typeof config.height === 'number' ? config.height : 600;\n this.cols = Math.floor(width / this.blockSize) || 10;\n this.rows = Math.floor(height / this.blockSize) || 20;\n const speed = typeof config.speed === 'number' ? config.speed : 1;\n this.scoring = config.scoring && typeof config.scoring === 'object'\n ? {\n singleLine: config.scoring.singleLine ?? 100,\n doubleLine: config.scoring.doubleLine ?? 300,\n tripleLine: config.scoring.tripleLine ?? 500,\n tetris: config.scoring.tetris ?? 800\n }\n : { singleLine: 100, doubleLine: 300, tripleLine: 500, tetris: 800 };\n\n this.dropInterval = Math.max(100, 1000 / speed);\n\n this.canvas = document.createElement('canvas');\n this.canvas.width = this.cols * this.blockSize;\n this.canvas.height = this.rows * this.blockSize;\n this.canvas.style.display = 'block';\n this.canvas.style.margin = '0 auto';\n this.canvas.style.border = '1px solid #333';\n this.container.appendChild(this.canvas);\n \n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.ctx = ctx;\n \n // Initialize game grid\n this.resetGrid();\n \n // Set up event listeners\n this.setupControls();\n }\n \n /**\n * Start the game\n */\n start(): void {\n if (this.isRunning) {\n return;\n }\n \n this.isRunning = true;\n this.resetGrid();\n this.createPiece();\n this.lastTime = 0;\n this.score = 0;\n \n // Start game loop\n this.update(0);\n }\n \n /**\n * Pause the game\n */\n pause(): void {\n if (!this.isRunning || !this.animationFrame) {\n return;\n }\n \n this.isRunning = false;\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n \n /**\n * Resume the game\n */\n resume(): void {\n if (this.isRunning) {\n return;\n }\n \n this.isRunning = true;\n this.lastTime = 0;\n this.update(0);\n }\n \n /**\n * Destroy the game and clean up\n */\n destroy(): void {\n // Stop game loop\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n \n // Remove event listeners\n window.removeEventListener('keydown', this.handleKeyDown);\n \n // Remove canvas\n if (this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n \n this.isRunning = false;\n }\n \n /**\n * Main game update loop\n */\n private update(time: number): void {\n if (!this.isRunning) {\n return;\n }\n \n const deltaTime = time - this.lastTime;\n this.lastTime = time;\n \n // Update drop counter\n this.dropCounter += deltaTime;\n if (this.dropCounter > this.dropInterval) {\n this.dropPiece();\n }\n \n // Draw game\n this.draw();\n \n // Continue game loop\n this.animationFrame = requestAnimationFrame(this.update.bind(this));\n }\n \n /**\n * Draw the game state\n */\n private draw(): void {\n // Clear canvas\n this.ctx.fillStyle = '#000';\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n \n // Draw grid\n this.drawGrid();\n \n // Draw current piece\n if (this.currentPiece) {\n this.drawPiece(this.currentPiece);\n }\n }\n \n /**\n * Draw the game grid\n */\n private drawGrid(): void {\n for (let y = 0; y < this.rows; y++) {\n for (let x = 0; x < this.cols; x++) {\n const value = this.grid[y][x];\n if (value !== 0) {\n this.ctx.fillStyle = this.colors[value];\n this.ctx.fillRect(\n x * this.blockSize,\n y * this.blockSize,\n this.blockSize,\n this.blockSize\n );\n \n // Draw outline\n this.ctx.strokeStyle = '#222';\n this.ctx.strokeRect(\n x * this.blockSize,\n y * this.blockSize,\n this.blockSize,\n this.blockSize\n );\n }\n }\n }\n }\n \n /**\n * Draw a tetromino piece\n */\n private drawPiece(piece: any): void {\n const { shape, pos } = piece;\n \n for (let y = 0; y < shape.length; y++) {\n for (let x = 0; x < shape[y].length; x++) {\n const value = shape[y][x];\n if (value !== 0) {\n this.ctx.fillStyle = this.colors[value];\n this.ctx.fillRect(\n (pos.x + x) * this.blockSize,\n (pos.y + y) * this.blockSize,\n this.blockSize,\n this.blockSize\n );\n \n // Draw outline\n this.ctx.strokeStyle = '#222';\n this.ctx.strokeRect(\n (pos.x + x) * this.blockSize,\n (pos.y + y) * this.blockSize,\n this.blockSize,\n this.blockSize\n );\n }\n }\n }\n }\n \n /**\n * Reset the game grid\n */\n private resetGrid(): void {\n this.grid = Array(this.rows).fill(0).map(() => Array(this.cols).fill(0));\n }\n \n /**\n * Create a new tetromino piece\n */\n private createPiece(): void {\n // If we have a next piece, use it\n if (this.nextPiece) {\n this.currentPiece = this.nextPiece;\n this.nextPiece = null;\n } else {\n // Create a new random piece\n const shapeIndex = Math.floor(Math.random() * this.shapes.length);\n this.currentPiece = {\n shape: this.shapes[shapeIndex],\n pos: { x: Math.floor(this.cols / 2) - 1, y: 0 }\n };\n }\n \n // Create the next piece\n const nextShapeIndex = Math.floor(Math.random() * this.shapes.length);\n this.nextPiece = {\n shape: this.shapes[nextShapeIndex],\n pos: { x: Math.floor(this.cols / 2) - 1, y: 0 }\n };\n \n // Check for game over\n if (this.checkCollision()) {\n // Game over\n this.isRunning = false;\n this.resetGrid();\n }\n }\n \n /**\n * Move the current piece down\n */\n private dropPiece(): void {\n this.currentPiece.pos.y++;\n this.dropCounter = 0;\n \n if (this.checkCollision()) {\n // Revert position\n this.currentPiece.pos.y--;\n \n // Merge piece with grid\n this.mergePiece();\n \n // Check for completed lines\n this.checkLines();\n \n // Create new piece\n this.createPiece();\n }\n }\n \n /**\n * Check if the current piece collides with the grid or boundaries\n */\n private checkCollision(): boolean {\n const { shape, pos } = this.currentPiece;\n \n for (let y = 0; y < shape.length; y++) {\n for (let x = 0; x < shape[y].length; x++) {\n if (shape[y][x] !== 0) {\n const gridX = pos.x + x;\n const gridY = pos.y + y;\n \n // Check boundaries\n if (gridX < 0 || gridX >= this.cols || gridY >= this.rows) {\n return true;\n }\n \n // Check collision with existing blocks\n if (gridY >= 0 && this.grid[gridY][gridX] !== 0) {\n return true;\n }\n }\n }\n }\n \n return false;\n }\n \n /**\n * Merge the current piece with the grid\n */\n private mergePiece(): void {\n const { shape, pos } = this.currentPiece;\n \n for (let y = 0; y < shape.length; y++) {\n for (let x = 0; x < shape[y].length; x++) {\n const value = shape[y][x];\n if (value !== 0) {\n const gridY = pos.y + y;\n const gridX = pos.x + x;\n \n // Only merge if within bounds\n if (gridY >= 0 && gridY < this.rows && gridX >= 0 && gridX < this.cols) {\n this.grid[gridY][gridX] = value;\n }\n }\n }\n }\n }\n \n /**\n * Check for completed lines and remove them\n */\n private checkLines(): void {\n let linesCleared = 0;\n \n for (let y = this.rows - 1; y >= 0; y--) {\n // Check if row is full\n if (this.grid[y].every(value => value !== 0)) {\n // Remove the line\n this.grid.splice(y, 1);\n \n // Add a new empty line at the top\n this.grid.unshift(Array(this.cols).fill(0));\n \n // Increment counter and check the same row again (since we moved rows down)\n linesCleared++;\n y++;\n }\n }\n \n if (linesCleared > 0) {\n const pts = [0, this.scoring.singleLine, this.scoring.doubleLine, this.scoring.tripleLine, this.scoring.tetris][linesCleared] ?? this.scoring.tetris;\n this.updateScore(pts);\n }\n }\n \n /**\n * Move the current piece left or right\n */\n private movePiece(dir: number): void {\n this.currentPiece.pos.x += dir;\n \n if (this.checkCollision()) {\n this.currentPiece.pos.x -= dir;\n }\n }\n \n /**\n * Rotate the current piece\n */\n private rotatePiece(): void {\n // Save current position\n const pos = this.currentPiece.pos.x;\n \n // Rotate matrix\n const rotated: number[][] = [];\n const shape = this.currentPiece.shape;\n \n for (let y = 0; y < shape[0].length; y++) {\n const row: number[] = [];\n for (let x = 0; x < shape.length; x++) {\n row.push(shape[shape.length - 1 - x][y]);\n }\n rotated.push(row);\n }\n \n // Apply rotation\n this.currentPiece.shape = rotated;\n \n // Check for collision and adjust if needed\n let offset = 1;\n while (this.checkCollision()) {\n this.currentPiece.pos.x += offset;\n offset = -(offset + (offset > 0 ? 1 : -1));\n \n // If we've tried moving too far, revert rotation\n if (offset > shape[0].length) {\n this.currentPiece.shape = shape;\n this.currentPiece.pos.x = pos;\n return;\n }\n }\n }\n \n /**\n * Handle keyboard input\n */\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (!this.isRunning) {\n return;\n }\n \n switch (e.key) {\n case 'ArrowLeft':\n this.movePiece(-1);\n break;\n case 'ArrowRight':\n this.movePiece(1);\n break;\n case 'ArrowDown':\n this.dropPiece();\n break;\n case 'ArrowUp':\n this.rotatePiece();\n break;\n case ' ': // Space - hard drop\n while (!this.checkCollision()) {\n this.currentPiece.pos.y++;\n }\n this.currentPiece.pos.y--;\n this.mergePiece();\n this.checkLines();\n this.createPiece();\n break;\n }\n };\n \n /**\n * Set up control event listeners\n */\n private setupControls(): void {\n window.addEventListener('keydown', this.handleKeyDown);\n \n // Mobile touch controls could be added here\n }\n} ","import { BaseGame, GameConfig } from './base';\n\ntype Direction = 'up' | 'down' | 'left' | 'right';\n\ninterface GridCell {\n x: number;\n y: number;\n}\n\n// Simple theme colors for snake/food (SDK has theme string only)\nconst THEME_COLORS: Record<string, { primary: string; secondary: string; accent: string; text: string }> = {\n default: { primary: '#333333', secondary: '#666666', accent: '#4caf50', text: '#222222' },\n cyberpunk: { primary: '#ff00ff', secondary: '#00ffff', accent: '#ffff00', text: '#ffffff' },\n minimal: { primary: '#000000', secondary: '#333333', accent: '#555555', text: '#111111' },\n corporate: { primary: '#3f51b5', secondary: '#7986cb', accent: '#ff4081', text: '#263238' }\n};\n\n/**\n * Snake game implementation\n */\nexport default class SnakeGame extends BaseGame {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n\n private snake: GridCell[] = [];\n private food: GridCell | null = null;\n private direction: Direction = 'right';\n private nextDirection: Direction = 'right';\n private animationFrame: number | null = null;\n private lastTime: number = 0;\n private moveInterval: number = 200;\n private moveCounter: number = 0;\n private highScore: number = 0;\n\n private gridSize: number;\n private cellSize: number;\n private gridWidth: number;\n private gridHeight: number;\n private foodValue: number;\n\n private touchStartX: number = 0;\n private touchStartY: number = 0;\n\n constructor(config: GameConfig) {\n super(config);\n\n this.gridSize = typeof config.gridSize === 'number' ? config.gridSize : 20;\n this.foodValue = typeof config.foodValue === 'number' ? config.foodValue : 10;\n const width = typeof config.width === 'number' ? config.width : 400;\n const height = typeof config.height === 'number' ? config.height : 400;\n this.gridWidth = this.gridSize;\n this.gridHeight = this.gridSize;\n this.cellSize = Math.max(10, Math.floor(Math.min(width, height) / this.gridSize)) || 20;\n this.moveInterval = typeof config.speed === 'number' && config.speed > 0\n ? Math.max(80, 200 / config.speed)\n : 200;\n this.canvas = document.createElement('canvas');\n this.canvas.width = this.gridWidth * this.cellSize;\n this.canvas.height = this.gridHeight * this.cellSize;\n this.canvas.style.display = 'block';\n this.canvas.style.margin = '0 auto';\n this.canvas.style.border = '1px solid #333';\n this.container.appendChild(this.canvas);\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n this.ctx = ctx;\n\n this.setupControls();\n }\n\n private getColors() {\n return THEME_COLORS[this.theme] || THEME_COLORS.default;\n }\n\n start(): void {\n if (this.isRunning) {\n return;\n }\n this.isRunning = true;\n this.resetGame();\n this.lastTime = 0;\n this.score = 0;\n this.moveInterval = 200;\n this.update(0);\n }\n\n pause(): void {\n if (!this.isRunning || !this.animationFrame) {\n return;\n }\n this.isRunning = false;\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n\n resume(): void {\n if (this.isRunning) {\n return;\n }\n this.isRunning = true;\n this.lastTime = 0;\n this.update(0);\n }\n\n destroy(): void {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('touchstart', this.handleTouchStart);\n window.removeEventListener('touchend', this.handleTouchEnd);\n if (this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.isRunning = false;\n }\n\n private update(time: number): void {\n if (!this.isRunning) return;\n\n const deltaTime = time - this.lastTime;\n this.lastTime = time;\n this.moveCounter += deltaTime;\n\n if (this.moveCounter >= this.moveInterval) {\n this.direction = this.nextDirection;\n this.moveSnake();\n this.moveCounter = 0;\n }\n\n this.draw();\n this.animationFrame = requestAnimationFrame(this.update.bind(this));\n }\n\n private draw(): void {\n const colors = this.getColors();\n this.ctx.fillStyle = '#0a0a0a';\n this.ctx.fillRect(0, 0, this.canvas.width, this.canvas.height);\n\n // Subtle grid\n this.ctx.strokeStyle = colors.text;\n this.ctx.globalAlpha = 0.15;\n for (let i = 0; i <= this.gridWidth; i++) {\n this.ctx.beginPath();\n this.ctx.moveTo(i * this.cellSize, 0);\n this.ctx.lineTo(i * this.cellSize, this.canvas.height);\n this.ctx.stroke();\n }\n for (let j = 0; j <= this.gridHeight; j++) {\n this.ctx.beginPath();\n this.ctx.moveTo(0, j * this.cellSize);\n this.ctx.lineTo(this.canvas.width, j * this.cellSize);\n this.ctx.stroke();\n }\n this.ctx.globalAlpha = 1;\n\n // Food\n if (this.food) {\n this.ctx.fillStyle = colors.secondary;\n this.ctx.fillRect(\n this.food.x * this.cellSize + 1,\n this.food.y * this.cellSize + 1,\n this.cellSize - 2,\n this.cellSize - 2\n );\n }\n\n // Snake body\n for (let i = 0; i < this.snake.length; i++) {\n const seg = this.snake[i];\n const isHead = i === this.snake.length - 1;\n this.ctx.fillStyle = isHead ? colors.accent : colors.primary;\n this.ctx.fillRect(\n seg.x * this.cellSize + 1,\n seg.y * this.cellSize + 1,\n this.cellSize - 2,\n this.cellSize - 2\n );\n }\n\n // Score\n this.ctx.fillStyle = colors.text;\n this.ctx.font = '14px Arial';\n this.ctx.fillText(`Score: ${this.score} High: ${this.highScore}`, 8, 18);\n }\n\n private resetGame(): void {\n const cx = Math.floor(this.gridWidth / 2);\n const cy = Math.floor(this.gridHeight / 2);\n this.snake = [\n { x: cx - 2, y: cy },\n { x: cx - 1, y: cy },\n { x: cx, y: cy }\n ];\n this.direction = 'right';\n this.nextDirection = 'right';\n this.spawnFood();\n }\n\n private spawnFood(): void {\n const empty: GridCell[] = [];\n for (let y = 0; y < this.gridHeight; y++) {\n for (let x = 0; x < this.gridWidth; x++) {\n if (!this.snake.some(s => s.x === x && s.y === y)) {\n empty.push({ x, y });\n }\n }\n }\n if (empty.length === 0) {\n this.food = null;\n return;\n }\n this.food = empty[Math.floor(Math.random() * empty.length)];\n }\n\n private moveSnake(): void {\n const head = this.snake[this.snake.length - 1];\n let nx = head.x;\n let ny = head.y;\n\n switch (this.direction) {\n case 'up': ny--; break;\n case 'down': ny++; break;\n case 'left': nx--; break;\n case 'right': nx++; break;\n }\n\n // Wall collision\n if (nx < 0 || nx >= this.gridWidth || ny < 0 || ny >= this.gridHeight) {\n this.gameOver();\n return;\n }\n\n // Self collision\n if (this.snake.some(s => s.x === nx && s.y === ny)) {\n this.gameOver();\n return;\n }\n\n this.snake.push({ x: nx, y: ny });\n\n // Food collision\n if (this.food && this.food.x === nx && this.food.y === ny) {\n this.updateScore(this.foodValue);\n if (this.score > this.highScore) this.highScore = this.score;\n this.spawnFood();\n if (this.moveInterval > 80) {\n this.moveInterval -= 5;\n }\n } else {\n this.snake.shift();\n }\n }\n\n private gameOver(): void {\n this.isRunning = false;\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n }\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (!this.isRunning) return;\n const current = this.nextDirection;\n switch (e.key) {\n case 'ArrowUp':\n if (current !== 'down') this.nextDirection = 'up';\n break;\n case 'ArrowDown':\n if (current !== 'up') this.nextDirection = 'down';\n break;\n case 'ArrowLeft':\n if (current !== 'right') this.nextDirection = 'left';\n break;\n case 'ArrowRight':\n if (current !== 'left') this.nextDirection = 'right';\n break;\n }\n e.preventDefault();\n };\n\n private handleTouchStart = (e: TouchEvent): void => {\n if (e.touches.length > 0) {\n this.touchStartX = e.touches[0].clientX;\n this.touchStartY = e.touches[0].clientY;\n }\n };\n\n private handleTouchEnd = (e: TouchEvent): void => {\n if (!this.isRunning || !e.changedTouches || e.changedTouches.length === 0) return;\n const dx = e.changedTouches[0].clientX - this.touchStartX;\n const dy = e.changedTouches[0].clientY - this.touchStartY;\n const minSwipe = 30;\n if (Math.abs(dx) > Math.abs(dy)) {\n if (dx > minSwipe && this.nextDirection !== 'left') this.nextDirection = 'right';\n else if (dx < -minSwipe && this.nextDirection !== 'right') this.nextDirection = 'left';\n } else {\n if (dy > minSwipe && this.nextDirection !== 'up') this.nextDirection = 'down';\n else if (dy < -minSwipe && this.nextDirection !== 'down') this.nextDirection = 'up';\n }\n };\n\n private setupControls(): void {\n window.addEventListener('keydown', this.handleKeyDown);\n window.addEventListener('touchstart', this.handleTouchStart, { passive: true });\n window.addEventListener('touchend', this.handleTouchEnd, { passive: true });\n }\n}\n","import { BaseGame, GameConfig } from './base';\n\ninterface Brick {\n x: number;\n y: number;\n width: number;\n height: number;\n visible: boolean;\n color: string;\n points: number;\n}\n\nconst THEME_COLORS: Record<string, { primary: string; secondary: string; accent: string; text: string }> = {\n default: { primary: '#333333', secondary: '#666666', accent: '#4caf50', text: '#222222' },\n cyberpunk: { primary: '#ff00ff', secondary: '#00ffff', accent: '#ffff00', text: '#ffffff' },\n minimal: { primary: '#000000', secondary: '#333333', accent: '#555555', text: '#111111' },\n corporate: { primary: '#3f51b5', secondary: '#7986cb', accent: '#ff4081', text: '#263238' }\n};\n\n/**\n * Breakout game implementation\n */\nexport default class BreakoutGame extends BaseGame {\n private canvas: HTMLCanvasElement;\n private ctx: CanvasRenderingContext2D;\n\n private paddle: { x: number; y: number; width: number; height: number };\n private ball: { x: number; y: number; dx: number; dy: number; radius: number };\n private bricks: Brick[] = [];\n private animationFrame: number | null = null;\n private lastTime: number = 0;\n private ballLaunched: boolean = false;\n private lives: number = 3;\n private level: number = 1;\n private highScore: number = 0;\n private paused: boolean = false;\n\n private readonly width: number;\n private readonly height: number;\n private readonly paddleWidth: number;\n private readonly paddleHeight: number = 10;\n private readonly ballRadius: number = 8;\n private readonly brickRows: number;\n private readonly brickColumns: number;\n private baseBallSpeed: number;\n private brickPadding: number = 8;\n private brickOffsetTop: number = 50;\n\n constructor(config: GameConfig) {\n super(config);\n\n this.width = typeof config.width === 'number' ? config.width : 480;\n this.height = typeof config.height === 'number' ? config.height : 320;\n this.paddleWidth = typeof config.paddleWidth === 'number' ? config.paddleWidth : 100;\n this.brickRows = typeof config.brickRows === 'number' ? config.brickRows : 5;\n this.brickColumns = typeof config.brickColumns === 'number' ? config.brickColumns : 8;\n this.baseBallSpeed = typeof config.ballSpeed === 'number' && config.ballSpeed > 0 ? config.ballSpeed : 5;\n\n this.canvas = document.createElement('canvas');\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.canvas.style.display = 'block';\n this.canvas.style.margin = '0 auto';\n this.canvas.style.border = '1px solid #333';\n this.container.appendChild(this.canvas);\n\n const ctx = this.canvas.getContext('2d');\n if (!ctx) throw new Error('Could not get canvas context');\n this.ctx = ctx;\n\n this.paddle = {\n x: this.width / 2 - this.paddleWidth / 2,\n y: this.height - 25,\n width: this.paddleWidth,\n height: this.paddleHeight\n };\n\n this.ball = {\n x: this.width / 2,\n y: this.height - 40,\n dx: 0,\n dy: 0,\n radius: this.ballRadius\n };\n\n this.setupControls();\n }\n\n private getColors() {\n return THEME_COLORS[this.theme] || THEME_COLORS.default;\n }\n\n start(): void {\n if (this.isRunning) return;\n this.isRunning = true;\n this.lives = 3;\n this.level = 1;\n this.score = 0;\n this.ballLaunched = false;\n this.baseBallSpeed = 5;\n this.resetGame();\n this.lastTime = 0;\n this.update(0);\n }\n\n pause(): void {\n if (!this.isRunning || !this.animationFrame) return;\n this.paused = true;\n this.isRunning = false;\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n\n resume(): void {\n if (this.isRunning) return;\n this.paused = false;\n this.isRunning = true;\n this.lastTime = 0;\n this.update(0);\n }\n\n destroy(): void {\n if (this.animationFrame) {\n cancelAnimationFrame(this.animationFrame);\n this.animationFrame = null;\n }\n this.canvas.removeEventListener('mousemove', this.handleMouseMove);\n this.canvas.removeEventListener('touchmove', this.handleTouchMove);\n this.canvas.removeEventListener('click', this.handleClick);\n window.removeEventListener('keydown', this.handleKeyDown);\n if (this.canvas.parentNode) {\n this.canvas.parentNode.removeChild(this.canvas);\n }\n this.isRunning = false;\n }\n\n private update(time: number): void {\n if (!this.isRunning) {\n this.draw();\n this.animationFrame = requestAnimationFrame(this.update.bind(this));\n return;\n }\n\n const deltaTime = Math.min(time - this.lastTime, 50);\n this.lastTime = time;\n\n if (!this.paused && this.ballLaunched) {\n this.updateGameState(deltaTime);\n }\n\n this.draw();\n this.animationFrame = requestAnimationFrame(this.update.bind(this));\n }\n\n private initBricks(): void {\n const colors = this.getColors();\n const rowColors = [colors.primary, colors.secondary, colors.accent];\n const brickW = (this.width - this.brickPadding * (this.brickColumns + 1)) / this.brickColumns;\n const brickH = 18;\n\n this.bricks = [];\n for (let r = 0; r < this.brickRows; r++) {\n for (let c = 0; c < this.brickColumns; c++) {\n const points = this.brickRows - r;\n this.bricks.push({\n x: this.brickPadding + c * (brickW + this.brickPadding),\n y: this.brickOffsetTop + r * (brickH + this.brickPadding),\n width: brickW,\n height: brickH,\n visible: true,\n color: rowColors[r % rowColors.length],\n points\n });\n }\n }\n }\n\n private resetGame(): void {\n this.initBricks();\n this.paddle.x = this.width / 2 - this.paddle.width / 2;\n this.paddle.y = this.height - 25;\n const speed = this.baseBallSpeed;\n this.ball.x = this.width / 2;\n this.ball.y = this.height - 40;\n this.ball.dx = 0;\n this.ball.dy = 0;\n this.ballLaunched = false;\n }\n\n private launchBall(): void {\n if (this.ballLaunched) return;\n this.ballLaunched = true;\n const speed = this.baseBallSpeed;\n this.ball.dx = speed * 0.6;\n this.ball.dy = -speed;\n }\n\n private updateGameState(deltaTime: number): void {\n this.ball.x += this.ball.dx;\n this.ball.y += this.ball.dy;\n\n if (this.ball.x - this.ball.radius < 0) {\n this.ball.x = this.ball.radius;\n this.ball.dx = -this.ball.dx;\n }\n if (this.ball.x + this.ball.radius > this.width) {\n this.ball.x = this.width - this.ball.radius;\n this.ball.dx = -this.ball.dx;\n }\n if (this.ball.y - this.ball.radius < 0) {\n this.ball.y = this.ball.radius;\n this.ball.dy = -this.ball.dy;\n }\n\n if (this.ball.y + this.ball.radius > this.paddle.y &&\n this.ball.y - this.ball.radius < this.paddle.y + this.paddle.height &&\n this.ball.x >= this.paddle.x &&\n this.ball.x <= this.paddle.x + this.paddle.width) {\n const hitPos = (this.ball.x - (this.paddle.x + this.paddle.width / 2)) / (this.paddle.width / 2);\n this.ball.dy = -Math.abs(this.ball.dy);\n this.ball.dx = this.baseBallSpeed * 0.8 * hitPos;\n this.ball.y = this.paddle.y - this.ball.radius;\n }\n\n if (this.ball.y + this.ball.radius > this.height) {\n this.lives--;\n if (this.lives <= 0) {\n this.isRunning = false;\n if (this.score > this.highScore) this.highScore = this.score;\n return;\n }\n this.ball.x = this.width / 2;\n this.ball.y = this.height - 40;\n this.ball.dx = 0;\n this.ball.dy = 0;\n this.ballLaunched = false;\n return;\n }\n\n for (const brick of this.bricks) {\n if (!brick.visible) continue;\n if (this.ball.x + this.ball.radius > brick.x &&\n this.ball.x - this.ball.radius < brick.x + brick.width &&\n this.ball.y + this.ball.radius > brick.y &&\n this.ball.y - this.ball.radius < brick.y + brick.height) {\n brick.visible = false;\n this.updateScore(brick.points);\n if (this.score > this.highScore) this.highScore = this.score;\n this.ball.dy = -this.ball.dy;\n break;\n }\n }\n\n const visibleCount = this.bricks.filter(b => b.visible).length;\n if (visibleCount === 0) {\n this.level++;\n this.baseBallSpeed = Math.min(this.baseBallSpeed * 1.1, this.baseBallSpeed * 2);\n this.resetGame();\n this.ballLaunched = false;\n }\n }\n\n private draw(): void {\n const colors = this.getColors();\n this.ctx.fillStyle = '#0a0a12';\n this.ctx.fillRect(0, 0, this.width, this.height);\n\n this.bricks.forEach(b => {\n if (!b.visible) return;\n this.ctx.fillStyle = b.color;\n this.ctx.fillRect(b.x, b.y, b.width, b.height);\n });\n\n this.ctx.fillStyle = colors.primary;\n this.ctx.fillRect(this.paddle.x, this.paddle.y, this.paddle.width, this.paddle.height);\n\n this.ctx.fillStyle = colors.accent;\n this.ctx.beginPath();\n this.ctx.arc(this.ball.x, this.ball.y, this.ball.radius, 0, Math.PI * 2);\n this.ctx.fill();\n\n this.ctx.fillStyle = colors.text;\n this.ctx.font = '14px Arial';\n this.ctx.fillText(`Lives: ${this.lives} Score: ${this.score} High: ${this.highScore}`, 8, 22);\n this.ctx.fillText(`Level ${this.level}`, this.width - 60, 22);\n\n for (let i = 0; i < this.lives; i++) {\n this.ctx.beginPath();\n this.ctx.arc(8 + i * 14, 38, 5, 0, Math.PI * 2);\n this.ctx.fillStyle = colors.accent;\n this.ctx.fill();\n }\n\n if (this.paused) {\n this.ctx.fillStyle = 'rgba(0,0,0,0.6)';\n this.ctx.fillRect(0, 0, this.width, this.height);\n this.ctx.fillStyle = '#fff';\n this.ctx.font = '24px Arial';\n this.ctx.textAlign = 'center';\n this.ctx.fillText('Paused - Press Space', this.width / 2, this.height / 2);\n this.ctx.textAlign = 'left';\n }\n\n if (!this.isRunning && this.lives <= 0) {\n this.ctx.fillStyle = 'rgba(0,0,0,0.7)';\n this.ctx.fillRect(0, 0, this.width, this.height);\n this.ctx.fillStyle = '#fff';\n this.ctx.font = '28px Arial';\n this.ctx.textAlign = 'center';\n this.ctx.fillText('Game Over', this.width / 2, this.height / 2 - 20);\n this.ctx.font = '16px Arial';\n this.ctx.fillText(`Score: ${this.score}`, this.width / 2, this.height / 2 + 10);\n this.ctx.textAlign = 'left';\n }\n\n if (this.isRunning && !this.ballLaunched) {\n this.ctx.fillStyle = 'rgba(0,0,0,0.4)';\n this.ctx.font = '14px Arial';\n this.ctx.textAlign = 'center';\n this.ctx.fillText('Click or tap to launch', this.width / 2, this.height / 2);\n this.ctx.textAlign = 'left';\n }\n }\n\n private handleMouseMove = (e: MouseEvent): void => {\n const rect = this.canvas.getBoundingClientRect();\n const scaleX = this.canvas.width / rect.width;\n const relativeX = (e.clientX - rect.left) * scaleX;\n this.paddle.x = Math.max(0, Math.min(this.width - this.paddle.width, relativeX - this.paddle.width / 2));\n };\n\n private handleTouchMove = (e: TouchEvent): void => {\n e.preventDefault();\n if (e.touches.length > 0) {\n const rect = this.canvas.getBoundingClientRect();\n const scaleX = this.canvas.width / rect.width;\n const relativeX = (e.touches[0].clientX - rect.left) * scaleX;\n this.paddle.x = Math.max(0, Math.min(this.width - this.paddle.width, relativeX - this.paddle.width / 2));\n }\n };\n\n private handleClick = (): void => {\n this.launchBall();\n };\n\n private handleKeyDown = (e: KeyboardEvent): void => {\n if (e.key === ' ') {\n e.preventDefault();\n if (this.isRunning) {\n if (this.paused) this.resume();\n else this.pause();\n }\n }\n };\n\n private setupControls(): void {\n this.canvas.addEventListener('mousemove', this.handleMouseMove);\n this.canvas.addEventListener('touchmove', this.handleTouchMove, { passive: false });\n this.canvas.addEventListener('click', this.handleClick);\n window.addEventListener('keydown', this.handleKeyDown);\n }\n}\n","import { GameType } from '../core';\nimport TetrisGame from './tetris';\nimport SnakeGame from './snake';\nimport BreakoutGame from './breakout';\nimport { GameConfig } from './base';\n\nexport { GameConfig } from './base';\nexport { BaseGame } from './base';\n\n/**\n * Load a game instance\n * @param gameType Type of game to load\n * @param config Game configuration\n * @returns Game instance\n */\nexport function loadGame(gameType: GameType, config: GameConfig): any {\n switch (gameType) {\n case 'tetris':\n return new TetrisGame(config);\n case 'snake':\n return new SnakeGame(config);\n case 'breakout':\n return new BreakoutGame(config);\n default:\n // TypeScript should prevent this, but just in case\n return new TetrisGame(config);\n }\n} ","import { GameOptions, GameType, ThemeType } from '../core';\n\n/**\n * Validate and normalize game options\n * @param options User-provided game options\n * @returns Validated game options\n */\nexport function validateOptions(options: GameOptions): GameOptions {\n const validatedOptions: GameOptions = { ...options };\n \n // Validate game type\n if (options.game && !isValidGameType(options.game)) {\n console.warn(`Invalid game type: ${options.game}. Defaulting to tetris.`);\n validatedOptions.game = 'tetris';\n }\n \n // Validate theme\n if (options.theme && !isValidThemeType(options.theme)) {\n console.warn(`Invalid theme: ${options.theme}. Defaulting to default theme.`);\n validatedOptions.theme = 'default';\n }\n \n // Ensure message is a string\n if (options.message && typeof options.message !== 'string') {\n validatedOptions.message = String(options.message);\n }\n \n // Validate dimensions\n if (options.width && (typeof options.width !== 'number' || options.width <= 0)) {\n delete validatedOptions.width;\n }\n \n if (options.height && (typeof options.height !== 'number' || options.height <= 0)) {\n delete validatedOptions.height;\n }\n \n return validatedOptions;\n}\n\n/**\n * Check if a game type is valid\n * @param game Game type to validate\n * @returns Whether the game type is valid\n */\nfunction isValidGameType(game: string): game is GameType {\n return ['tetris', 'snake', 'breakout'].includes(game);\n}\n\n/**\n * Check if a theme type is valid\n * @param theme Theme type to validate\n * @returns Whether the theme type is valid\n */\nfunction isValidThemeType(theme: string): theme is ThemeType {\n return ['default', 'cyberpunk', 'minimal', 'corporate'].includes(theme);\n}\n\n/**\n * Preload common assets used by games\n */\nexport function preloadAssets(): void {\n // This would preload images, sounds, etc. needed by the games\n // For now, we'll just create a placeholder implementation\n \n // Example of image preloading\n const imageUrls: string[] = [\n // These would be actual URLs in production\n // 'https://assets.waitlessapi.com/tetris/blocks.png',\n // 'https://assets.waitlessapi.com/common/bg.png'\n ];\n \n imageUrls.forEach(url => {\n const img = new Image();\n img.src = url;\n });\n}\n\n/**\n * Detect browser capabilities and limitations\n * @returns Object with browser capability information\n */\nexport function detectBrowserCapabilities() {\n return {\n touchEnabled: 'ontouchstart' in window || navigator.maxTouchPoints > 0,\n webGLSupport: isWebGLSupported(),\n screenSize: {\n width: window.innerWidth,\n height: window.innerHeight\n }\n };\n}\n\n/**\n * Check if WebGL is supported\n * @returns Whether WebGL is supported\n */\nfunction isWebGLSupported(): boolean {\n try {\n const canvas = document.createElement('canvas');\n return !!(window.WebGLRenderingContext && \n (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')));\n } catch (e) {\n return false;\n }\n}\n\n/**\n * Create a throttled function\n * @param callback Function to throttle\n * @param delay Delay in milliseconds\n * @returns Throttled function\n */\nexport function throttle<T extends (...args: any[]) => any>(\n callback: T,\n delay: number\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n return (...args: Parameters<T>) => {\n const now = Date.now();\n if (now - lastCall >= delay) {\n lastCall = now;\n callback(...args);\n }\n };\n} ","export interface AdConfig {\n adTagUrl: string;\n maxDuration?: number; // seconds\n onAdStarted?: () => void;\n onAdComplete?: () => void;\n onAdError?: (error: any) => void;\n onAdSkipped?: () => void;\n}\n\ndeclare global {\n interface Window {\n google?: {\n ima: {\n AdDisplayContainer: new (container: HTMLElement, videoElement: HTMLVideoElement) => any;\n AdsLoader: new (adDisplayContainer: any) => any;\n AdsManagerLoadedEvent: { Type: { ADS_MANAGER_LOADED: string } };\n AdErrorEvent: { Type: { AD_ERROR: string } };\n AdsRequest: new () => any;\n AdsRenderingSettings: new () => any;\n AdEvent: { Type: { CONTENT_PAUSE_REQUESTED: string; CONTENT_RESUME_REQUESTED: string; ALL_ADS_COMPLETED: string; SKIPPED: string } };\n ViewMode: { NORMAL: number };\n };\n };\n }\n}\n\nexport class AdPlayer {\n private container: HTMLElement;\n private adDisplayContainer: any;\n private adsLoader: any;\n private adsManager: any;\n private videoElement: HTMLVideoElement;\n private adContainer: HTMLElement;\n private loadingOverlay: HTMLElement | null = null;\n private adBadge: HTMLElement | null = null;\n\n constructor(container: HTMLElement) {\n this.container = container;\n this.adDisplayContainer = null;\n this.adsLoader = null;\n this.adsManager = null;\n this.videoElement = null as any;\n this.adContainer = null as any;\n this.setupElements();\n }\n\n private setupElements(): void {\n this.videoElement = document.createElement('video');\n this.videoElement.style.cssText = `\n width: 100%;\n height: 100%;\n object-fit: contain;\n background: #000;\n `;\n\n this.adContainer = document.createElement('div');\n const w = Math.max(this.container.offsetWidth || 1, 1);\n const h = Math.max(this.container.offsetHeight || 1, 1);\n this.adContainer.style.cssText = `\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n min-width: ${w}px;\n min-height: ${h}px;\n `;\n this.adContainer.appendChild(this.videoElement);\n\n this.adBadge = document.createElement('div');\n this.adBadge.textContent = 'Ad';\n this.adBadge.style.cssText = `\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 10px;\n font-family: sans-serif;\n color: rgba(255,255,255,0.9);\n background: rgba(0,0,0,0.5);\n padding: 2px 6px;\n border-radius: 2px;\n z-index: 10;\n display: none;\n `;\n this.adContainer.appendChild(this.adBadge);\n this.container.appendChild(this.adContainer);\n }\n\n private showLoadingOverlay(): void {\n if (this.loadingOverlay && this.loadingOverlay.parentNode) return;\n this.loadingOverlay = document.createElement('div');\n this.loadingOverlay.setAttribute('aria-live', 'polite');\n this.loadingOverlay.setAttribute('aria-label', 'Loading ad');\n this.loadingOverlay.style.cssText = `\n position: absolute;\n top: 0; left: 0;\n width: 100%; height: 100%;\n background: rgba(0,0,0,0.85);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n z-index: 20;\n color: rgba(255,255,255,0.9);\n font-family: sans-serif;\n font-size: 14px;\n `;\n const spinner = document.createElement('div');\n spinner.style.cssText = `\n width: 32px; height: 32px;\n border: 3px solid rgba(255,255,255,0.2);\n border-top-color: #fff;\n border-radius: 50%;\n animation: ad-spin 0.8s linear infinite;\n `;\n const style = document.createElement('style');\n style.textContent = '@keyframes ad-spin { to { transform: rotate(360deg); } }';\n this.loadingOverlay.appendChild(style);\n this.loadingOverlay.appendChild(spinner);\n const text = document.createElement('span');\n text.textContent = 'Loading ad…';\n this.loadingOverlay.appendChild(text);\n this.container.appendChild(this.loadingOverlay);\n }\n\n private removeLoadingOverlay(): void {\n if (this.loadingOverlay && this.loadingOverlay.parentNode) {\n this.loadingOverlay.parentNode.removeChild(this.loadingOverlay);\n }\n this.loadingOverlay = null;\n }\n\n private showErrorOverlay(thenRun: () => void): void {\n this.removeLoadingOverlay();\n const overlay = document.createElement('div');\n overlay.setAttribute('aria-live', 'polite');\n overlay.setAttribute('aria-label', 'Ad could not load');\n overlay.style.cssText = `\n position: absolute;\n top: 0; left: 0;\n width: 100%; height: 100%;\n background: rgba(0,0,0,0.9);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n z-index: 30;\n color: rgba(255,255,255,0.95);\n font-family: sans-serif;\n font-size: 14px;\n `;\n const message = document.createElement('p');\n message.textContent = \"Ad couldn't load\";\n message.style.margin = '0';\n overlay.appendChild(message);\n const btn = document.createElement('button');\n btn.textContent = 'Continue';\n btn.style.cssText = `\n padding: 8px 20px;\n font-size: 14px;\n cursor: pointer;\n background: rgba(255,255,255,0.2);\n color: #fff;\n border: 1px solid rgba(255,255,255,0.4);\n border-radius: 4px;\n `;\n const run = () => {\n if (overlay.parentNode) overlay.parentNode.removeChild(overlay);\n thenRun();\n };\n btn.addEventListener('click', run);\n overlay.appendChild(btn);\n this.container.appendChild(overlay);\n setTimeout(run, 3000);\n }\n\n async playAd(config: AdConfig): Promise<void> {\n return new Promise((resolve) => {\n this.showLoadingOverlay();\n const onError = () => {\n this.showErrorOverlay(() => {\n this.cleanup();\n resolve();\n });\n };\n if (!(window as any).google?.ima) {\n this.loadIMAScript()\n .then(() => this.initializeAd(config, resolve, onError))\n .catch(() => {\n config.onAdError?.(new Error('Failed to load IMA SDK'));\n onError();\n });\n } else {\n this.initializeAd(config, resolve, onError);\n }\n });\n }\n\n private loadIMAScript(): Promise<void> {\n return new Promise((resolve, reject) => {\n if ((window as any).google?.ima) {\n resolve();\n return;\n }\n\n const script = document.createElement('script');\n script.src = 'https://imasdk.googleapis.com/js/sdkloader/ima3.js';\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error('Failed to load IMA SDK'));\n document.head.appendChild(script);\n });\n }\n\n private initializeAd(config: AdConfig, resolve: () => void, onError: () => void): void {\n const google = (window as any).google;\n if (!google?.ima) {\n config.onAdError?.(new Error('IMA SDK not available'));\n onError();\n return;\n }\n\n this.adDisplayContainer = new google.ima.AdDisplayContainer(\n this.adContainer,\n this.videoElement\n );\n\n this.adsLoader = new google.ima.AdsLoader(this.adDisplayContainer);\n\n this.adsLoader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (event: any) => this.onAdsManagerLoaded(event, config, resolve, onError),\n false\n );\n\n this.adsLoader.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (event: any) => {\n console.warn('Ad error:', event.getError());\n config.onAdError?.(event.getError());\n this.showErrorOverlay(() => {\n this.cleanup();\n resolve();\n });\n },\n false\n );\n\n const adsRequest = new google.ima.AdsRequest();\n adsRequest.adTagUrl = config.adTagUrl;\n adsRequest.linearAdSlotWidth = this.container.offsetWidth;\n adsRequest.linearAdSlotHeight = this.container.offsetHeight;\n adsRequest.nonLinearAdSlotWidth = this.container.offsetWidth;\n adsRequest.nonLinearAdSlotHeight = this.container.offsetHeight;\n\n this.adDisplayContainer.initialize();\n this.adsLoader.requestAds(adsRequest);\n }\n\n private onAdsManagerLoaded(event: any, config: AdConfig, resolve: () => void, onError: () => void): void {\n const google = (window as any).google;\n if (!google?.ima) {\n resolve();\n return;\n }\n\n const adsRenderingSettings = new google.ima.AdsRenderingSettings();\n adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n\n this.adsManager = event.getAdsManager(this.videoElement, adsRenderingSettings);\n\n this.adsManager.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (e: any) => {\n console.warn('Ad manager error:', e.getError());\n config.onAdError?.(e.getError());\n this.showErrorOverlay(() => {\n this.cleanup();\n resolve();\n });\n }\n );\n\n this.adsManager.addEventListener(\n google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED,\n () => {\n this.removeLoadingOverlay();\n if (this.adBadge) this.adBadge.style.display = 'block';\n config.onAdStarted?.();\n }\n );\n\n this.adsManager.addEventListener(\n google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED,\n () => {\n config.onAdComplete?.();\n this.cleanup();\n resolve();\n }\n );\n\n this.adsManager.addEventListener(\n google.ima.AdEvent.Type.ALL_ADS_COMPLETED,\n () => {\n config.onAdComplete?.();\n this.cleanup();\n resolve();\n }\n );\n\n this.adsManager.addEventListener(\n google.ima.AdEvent.Type.SKIPPED,\n () => {\n config.onAdSkipped?.();\n this.cleanup();\n resolve();\n }\n );\n\n try {\n this.adsManager.init(\n this.container.offsetWidth,\n this.container.offsetHeight,\n google.ima.ViewMode.NORMAL\n );\n this.adsManager.start();\n } catch (error) {\n console.warn('Ad start error:', error);\n config.onAdError?.(error);\n this.showErrorOverlay(() => {\n this.cleanup();\n resolve();\n });\n }\n }\n\n private cleanup(): void {\n if (this.adsManager) {\n try {\n this.adsManager.destroy();\n } catch (_) {}\n this.adsManager = null;\n }\n if (this.adsLoader) {\n try {\n this.adsLoader.destroy();\n } catch (_) {}\n this.adsLoader = null;\n }\n this.removeLoadingOverlay();\n if (this.adContainer && this.adContainer.parentNode) {\n this.adContainer.parentNode.removeChild(this.adContainer);\n }\n this.adBadge = null;\n }\n\n destroy(): void {\n this.cleanup();\n }\n}\n","import { loadGame } from './games';\nimport { GameConfig } from './games/base';\nimport { validateOptions, preloadAssets } from './utils';\nimport { AdPlayer } from './ads/AdPlayer';\n\nexport type GameType = 'tetris' | 'snake' | 'breakout';\nexport type ThemeType = 'default' | 'cyberpunk' | 'minimal' | 'corporate';\n\n/** Ad config shape from dashboard/backend (used by showAd and overrides) */\nexport interface WaitlessConfig {\n strategy?: { preset?: string; behavior?: string };\n frequency?: { minInterval?: number; maxAdsPerSession?: number; maxAdsPerHour?: number };\n duration?: {\n shortThreshold?: number;\n longThreshold?: number;\n adMaxDuration?: number;\n enableGames?: boolean;\n };\n batch?: { enabled?: boolean; showAdOnce?: boolean };\n fallback?: { type?: string; showMessage?: boolean };\n analytics?: { trackEvents?: boolean; enableABTesting?: boolean };\n}\n\nconst CONFIG_CACHE_TTL_MS = 5 * 60 * 1000;\nconst CONFIG_CACHE_KEY_PREFIX = 'waitless_config_';\n\nexport interface GameOptions {\n game?: GameType;\n theme?: ThemeType;\n message?: string;\n container?: HTMLElement | string;\n width?: number;\n height?: number;\n onStart?: () => void;\n onScore?: (score: number) => void;\n onEnd?: () => void;\n showAds?: boolean;\n adTagUrl?: string;\n adDuration?: number;\n adPlacement?: 'pre-game' | 'post-game' | 'both';\n}\n\nconst DEFAULT_AD_TAG_URL = 'https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator=';\n\nexport class WaitlessAPI {\n private apiKey: string;\n private baseUrl: string;\n private apiBaseUrl: string;\n private defaultAdTagUrl: string;\n private sessionId: string | null = null;\n private container: HTMLElement | null = null;\n private gameInstance: any = null;\n private isPlaying: boolean = false;\n private lastBackendConfig: Record<string, any> | null = null;\n private config: WaitlessConfig | null = null;\n private configLoaded: boolean = false;\n private configPromise: Promise<void> | null = null;\n private batchIdsSeen: Set<string> = new Set();\n private lastAdTime: number = 0;\n private adsThisSession: number = 0;\n private adsThisHour: number = 0;\n private lastHourStart: number = 0;\n\n /**\n * Initialize the WaitlessAPI SDK\n * @param apiKey Your WaitlessAPI key\n * @param baseUrlOrOptions Base URL string or options object with apiBaseUrl (defaults to production)\n */\n constructor(apiKey: string, baseUrlOrOptions: string | { apiBaseUrl?: string } = 'https://api.waitlessapi.com') {\n if (!apiKey) {\n throw new Error('API key is required');\n }\n const baseUrl =\n typeof baseUrlOrOptions === 'string'\n ? baseUrlOrOptions\n : baseUrlOrOptions?.apiBaseUrl ?? 'https://api.waitlessapi.com';\n\n this.apiKey = apiKey;\n this.baseUrl = baseUrl;\n this.apiBaseUrl = baseUrl;\n this.defaultAdTagUrl = DEFAULT_AD_TAG_URL;\n this.configPromise = this.loadConfig();\n\n preloadAssets();\n }\n\n private getDefaultConfig(): WaitlessConfig {\n return {\n strategy: { preset: 'balanced', behavior: 'auto' },\n frequency: { minInterval: 300, maxAdsPerSession: 3, maxAdsPerHour: 6 },\n duration: { shortThreshold: 10, longThreshold: 60, adMaxDuration: 15, enableGames: true },\n batch: { enabled: true, showAdOnce: true },\n fallback: { type: 'spinner', showMessage: true },\n analytics: { trackEvents: true, enableABTesting: false }\n };\n }\n\n private getCachedConfig(): WaitlessConfig | null {\n try {\n const raw = typeof localStorage !== 'undefined' ? localStorage.getItem(CONFIG_CACHE_KEY_PREFIX + this.apiKey) : null;\n if (!raw) return null;\n const { config, timestamp } = JSON.parse(raw) as { config: WaitlessConfig; timestamp: number };\n if (Date.now() - timestamp > CONFIG_CACHE_TTL_MS) return null;\n return config;\n } catch {\n return null;\n }\n }\n\n private cacheConfig(config: WaitlessConfig): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(\n CONFIG_CACHE_KEY_PREFIX + this.apiKey,\n JSON.stringify({ config, timestamp: Date.now() })\n );\n }\n } catch {\n // ignore\n }\n }\n\n private async loadConfig(): Promise<void> {\n const cached = this.getCachedConfig();\n if (cached) {\n this.config = cached;\n this.configLoaded = true;\n return;\n }\n try {\n const url = `${this.apiBaseUrl}/api/keys/${encodeURIComponent(this.apiKey)}/config`;\n const res = await fetch(url);\n if (res.ok) {\n const data = (await res.json()) as WaitlessConfig;\n this.config = data;\n this.cacheConfig(data);\n } else {\n this.config = this.getDefaultConfig();\n }\n } catch {\n this.config = this.getDefaultConfig();\n }\n this.configLoaded = true;\n }\n\n /** Wait for config to be loaded (e.g. before using showAd). */\n private async ensureConfigLoaded(): Promise<void> {\n if (!this.configLoaded && this.configPromise) await this.configPromise;\n }\n\n /** Clear cache and reload config from API. */\n async refreshConfig(): Promise<void> {\n try {\n if (typeof localStorage !== 'undefined') localStorage.removeItem(CONFIG_CACHE_KEY_PREFIX + this.apiKey);\n } catch {\n // ignore\n }\n this.configLoaded = false;\n this.configPromise = this.loadConfig();\n await this.configPromise;\n }\n\n /** Return current config (for debugging). */\n getConfig(): WaitlessConfig | null {\n return this.config;\n }\n\n /**\n * Run processing with a minimal fallback UI (spinner/message). No ad or game.\n */\n private async showProcessing<T>(\n processingFn: () => Promise<T>,\n type: string,\n message: string\n ): Promise<T> {\n const overlay = document.createElement('div');\n overlay.style.cssText =\n 'position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.7);display:flex;flex-direction:column;align-items:center;justify-content:center;';\n const text = document.createElement('div');\n text.textContent = message || 'Processing...';\n text.style.cssText = 'color:#fff;font-size:18px;margin-top:12px;';\n const spinner = document.createElement('div');\n spinner.style.cssText =\n 'width:40px;height:40px;border:3px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:waitless-spin 0.8s linear infinite;';\n if (!document.getElementById('waitless-spinner-style')) {\n const style = document.createElement('style');\n style.id = 'waitless-spinner-style';\n style.textContent = '@keyframes waitless-spin { to { transform: rotate(360deg); } }';\n document.head.appendChild(style);\n }\n overlay.appendChild(spinner);\n overlay.appendChild(text);\n document.body.appendChild(overlay);\n try {\n return await processingFn();\n } finally {\n overlay.remove();\n }\n }\n\n private shouldShowAd(frequency: WaitlessConfig['frequency']): boolean {\n if (!frequency) return true;\n const now = Date.now();\n const minInterval = (frequency.minInterval ?? 300) * 1000;\n if (now - this.lastAdTime < minInterval) return false;\n const maxSession = frequency.maxAdsPerSession ?? 3;\n if (this.adsThisSession >= maxSession) return false;\n const hourMs = 60 * 60 * 1000;\n const currentHourStart = Math.floor(now / hourMs) * hourMs;\n if (currentHourStart !== this.lastHourStart) {\n this.lastHourStart = currentHourStart;\n this.adsThisHour = 0;\n }\n const maxHour = frequency.maxAdsPerHour ?? 6;\n if (this.adsThisHour >= maxHour) return false;\n return true;\n }\n\n private recordAdShown(): void {\n this.lastAdTime = Date.now();\n this.adsThisSession += 1;\n this.adsThisHour += 1;\n }\n\n /**\n * Config-driven entry point: show ad and/or game based on dashboard config, then run processing.\n */\n async showAd<T>(\n processingFn: () => Promise<T>,\n options: {\n estimatedDuration?: number;\n batchId?: string;\n message?: string;\n overrideConfig?: Partial<WaitlessConfig>;\n } = {}\n ): Promise<T> {\n if (!processingFn || typeof processingFn !== 'function') {\n throw new Error('Processing function is required and must be a function');\n }\n await this.ensureConfigLoaded();\n const base = this.config ?? this.getDefaultConfig();\n const merged: WaitlessConfig = {\n ...base,\n strategy: { ...base.strategy, ...options.overrideConfig?.strategy },\n frequency: { ...base.frequency, ...options.overrideConfig?.frequency },\n duration: { ...base.duration, ...options.overrideConfig?.duration },\n batch: { ...base.batch, ...options.overrideConfig?.batch },\n fallback: { ...base.fallback, ...options.overrideConfig?.fallback },\n analytics: { ...base.analytics, ...options.overrideConfig?.analytics }\n };\n const batch = merged.batch ?? {};\n const frequency = merged.frequency ?? {};\n const strategy = merged.strategy ?? {};\n const behavior = strategy.behavior ?? 'auto';\n const duration = merged.duration ?? {};\n const message = options.message ?? 'Loading...';\n\n if (options.batchId && batch.enabled && batch.showAdOnce && this.batchIdsSeen.has(options.batchId)) {\n return this.showProcessing(processingFn, 'spinner', message);\n }\n if (!this.shouldShowAd(frequency)) {\n return this.showProcessing(processingFn, 'spinner', message);\n }\n\n const shortThreshold = duration.shortThreshold ?? 10;\n const longThreshold = duration.longThreshold ?? 60;\n const estimatedDuration = options.estimatedDuration ?? 0;\n const enableGames = duration.enableGames !== false;\n let mode: 'ad-only' | 'ad-plus-game' | 'game-only' = 'ad-only';\n if (behavior === 'game-only' || (enableGames && estimatedDuration > longThreshold)) {\n mode = 'game-only';\n } else if (enableGames && estimatedDuration > shortThreshold && estimatedDuration <= longThreshold) {\n mode = 'ad-plus-game';\n }\n\n if (options.batchId && batch.enabled && batch.showAdOnce) {\n this.batchIdsSeen.add(options.batchId);\n }\n\n if (mode === 'game-only') {\n return this.showGame(processingFn, { message });\n }\n\n const validatedOptions = validateOptions({ container: undefined, message });\n const session = await this.createSession(validatedOptions);\n const { container, overlay } = this.initializeGameUI(validatedOptions);\n const adMaxDuration = duration.adMaxDuration ?? 15;\n\n try {\n if (session.sessionId) {\n await this.playAdInContainer(container, {\n adTagUrl: this.defaultAdTagUrl,\n maxDuration: adMaxDuration,\n sessionId: session.sessionId\n });\n this.recordAdShown();\n }\n if (mode === 'ad-plus-game') {\n const gameInstance = this.startGame(validatedOptions);\n const result = await processingFn();\n this.endGame(session.sessionId);\n this.cleanup(overlay, gameInstance);\n return result;\n }\n container.innerHTML = '';\n const spinner = document.createElement('div');\n spinner.style.cssText =\n 'width:40px;height:40px;border:3px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:waitless-spin 0.8s linear infinite;margin:auto;';\n const text = document.createElement('div');\n text.textContent = message;\n text.style.cssText = 'color:#fff;font-size:18px;margin-top:12px;text-align:center;';\n container.style.display = 'flex';\n container.style.flexDirection = 'column';\n container.style.alignItems = 'center';\n container.style.justifyContent = 'center';\n container.appendChild(spinner);\n container.appendChild(text);\n if (!document.getElementById('waitless-spinner-style')) {\n const style = document.createElement('style');\n style.id = 'waitless-spinner-style';\n style.textContent = '@keyframes waitless-spin { to { transform: rotate(360deg); } }';\n document.head.appendChild(style);\n }\n const result = await processingFn();\n this.endGame(session.sessionId);\n this.cleanup(overlay, null);\n return result;\n } catch (err) {\n this.endGame(session.sessionId);\n this.cleanup(overlay, null);\n throw err;\n }\n }\n\n /**\n * Show a game while executing a long-running function\n * @param processingFn The function to execute while showing the game\n * @param options Game configuration options\n * @returns Promise with the result of the processing function\n */\n async showGame<T>(processingFn: () => Promise<T>, options: GameOptions = {}): Promise<T> {\n if (!processingFn || typeof processingFn !== 'function') {\n throw new Error('Processing function is required and must be a function');\n }\n\n const showAds = options.showAds !== false && this.apiKey !== 'demo';\n const adPlacement = options.adPlacement || 'pre-game';\n const validatedOptions = validateOptions(options);\n\n const session = await this.createSession(validatedOptions);\n const { container, overlay } = this.initializeGameUI(validatedOptions);\n let gameInstance: any = null;\n\n try {\n if (showAds && session.sessionId && (adPlacement === 'pre-game' || adPlacement === 'both')) {\n await this.playAdInContainer(container, {\n adTagUrl: options.adTagUrl || this.defaultAdTagUrl,\n maxDuration: options.adDuration || 15,\n sessionId: session.sessionId\n });\n }\n\n gameInstance = this.startGame(validatedOptions);\n const result = await processingFn();\n\n if (showAds && session.sessionId && (adPlacement === 'post-game' || adPlacement === 'both')) {\n await this.playAdInContainer(container, {\n adTagUrl: options.adTagUrl || this.defaultAdTagUrl,\n maxDuration: options.adDuration || 15,\n sessionId: session.sessionId\n });\n }\n\n this.endGame(session.sessionId);\n this.cleanup(overlay, gameInstance);\n return result;\n } catch (error) {\n this.endGame(session.sessionId);\n this.cleanup(overlay, gameInstance || this.gameInstance);\n throw error;\n }\n }\n\n /**\n * Create a new game session with the API\n * @param options Game options\n * @returns Session id and config (null for demo/offline)\n */\n private async createSession(options: GameOptions): Promise<{ sessionId: string | null; config?: Record<string, any> | null }> {\n if (this.apiKey === 'demo') {\n this.sessionId = null;\n this.lastBackendConfig = null;\n return { sessionId: null, config: null };\n }\n try {\n const response = await fetch(`${this.baseUrl}/sessions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey\n },\n body: JSON.stringify({\n game: options.game,\n theme: options.theme,\n message: options.message\n })\n });\n\n if (!response.ok) {\n throw new Error(`Failed to create game session: ${response.statusText}`);\n }\n\n const data = await response.json();\n this.sessionId = data.sessionId;\n this.lastBackendConfig = data.config && typeof data.config === 'object' ? data.config : null;\n return { sessionId: this.sessionId, config: this.lastBackendConfig };\n } catch (error) {\n console.error('Error creating WaitlessAPI session:', error);\n this.sessionId = null;\n this.lastBackendConfig = null;\n return { sessionId: null, config: null };\n }\n }\n\n /**\n * Initialize the game UI container\n * @param options Game options\n * @returns container and overlay (overlay is non-null when we created the full-screen div)\n */\n private initializeGameUI(options: GameOptions): { container: HTMLElement; overlay: HTMLElement | null } {\n let overlay: HTMLElement | null = null;\n if (options.container) {\n if (typeof options.container === 'string') {\n this.container = document.querySelector(options.container);\n if (!this.container) {\n throw new Error(`Container element not found: ${options.container}`);\n }\n } else {\n this.container = options.container;\n }\n } else {\n this.container = document.createElement('div');\n this.container.id = 'waitless-game-container';\n this.container.style.position = 'fixed';\n this.container.style.top = '0';\n this.container.style.left = '0';\n this.container.style.width = '100%';\n this.container.style.height = '100%';\n this.container.style.zIndex = '9999';\n document.body.appendChild(this.container);\n overlay = this.container;\n }\n\n if (options.width) {\n this.container.style.width = `${options.width}px`;\n }\n if (options.height) {\n this.container.style.height = `${options.height}px`;\n }\n\n const messageElement = document.createElement('div');\n messageElement.id = 'waitless-message';\n messageElement.textContent = options.message || 'Loading...';\n messageElement.style.position = 'absolute';\n messageElement.style.bottom = '20px';\n messageElement.style.left = '0';\n messageElement.style.width = '100%';\n messageElement.style.textAlign = 'center';\n messageElement.style.color = '#ffffff';\n messageElement.style.fontSize = '18px';\n messageElement.style.fontFamily = 'Arial, sans-serif';\n messageElement.style.padding = '10px';\n this.container.appendChild(messageElement);\n\n return { container: this.container, overlay };\n }\n\n /**\n * Start the game\n * @param options Game options\n * @returns The game instance\n */\n private startGame(options: GameOptions): any {\n if (!this.container) {\n return null;\n }\n\n const mergedConfig: Record<string, any> = {\n container: this.container,\n theme: options.theme || 'default',\n onScore: options.onScore\n };\n if (options.width != null) mergedConfig.width = options.width;\n if (options.height != null) mergedConfig.height = options.height;\n if (this.lastBackendConfig) {\n Object.assign(mergedConfig, this.lastBackendConfig);\n }\n\n this.gameInstance = loadGame(options.game || 'tetris', mergedConfig as GameConfig);\n\n if (this.gameInstance && typeof this.gameInstance.start === 'function') {\n this.gameInstance.start();\n }\n\n this.isPlaying = true;\n\n if (options.onStart && typeof options.onStart === 'function') {\n options.onStart();\n }\n\n return this.gameInstance;\n }\n\n private async playAdInContainer(\n container: HTMLElement,\n config: { adTagUrl: string; maxDuration: number; sessionId: string | null }\n ): Promise<void> {\n if (config.sessionId === null) {\n return;\n }\n\n const adPlayer = new AdPlayer(container);\n const adStartTime = Date.now();\n\n try {\n await adPlayer.playAd({\n adTagUrl: config.adTagUrl,\n maxDuration: config.maxDuration,\n onAdStarted: () => {\n this.trackAdEvent(config.sessionId!, 'ad_started');\n },\n onAdComplete: () => {\n const duration = (Date.now() - adStartTime) / 1000;\n this.trackAdEvent(config.sessionId!, 'ad_completed', { duration });\n },\n onAdSkipped: () => {\n const duration = (Date.now() - adStartTime) / 1000;\n this.trackAdEvent(config.sessionId!, 'ad_skipped', { duration });\n },\n onAdError: (error) => {\n this.trackAdEvent(config.sessionId!, 'ad_error', { error: String(error) });\n }\n });\n } catch (error) {\n console.warn('Ad loading failed, continuing:', error);\n } finally {\n adPlayer.destroy();\n }\n }\n\n private async trackAdEvent(sessionId: string, event: string, data?: any): Promise<void> {\n try {\n await fetch(`${this.baseUrl}/sessions/${sessionId}/ad-event`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey\n },\n body: JSON.stringify({\n event,\n timestamp: Date.now(),\n ...data\n })\n });\n } catch (error) {\n console.warn('Failed to track ad event:', error);\n }\n }\n\n private cleanup(overlay: HTMLElement | null, gameInstance: any): void {\n if (overlay && overlay.parentNode) {\n overlay.parentNode.removeChild(overlay);\n }\n this.container = null;\n this.gameInstance = null;\n this.isPlaying = false;\n }\n\n /**\n * End the game and send session complete (overlay removal is done in cleanup)\n */\n private endGame(sessionId?: string | null): void {\n if (!this.isPlaying && !this.gameInstance) {\n return;\n }\n\n const score = this.gameInstance && typeof this.gameInstance.getScore === 'function'\n ? this.gameInstance.getScore()\n : (this.gameInstance?.score ?? 0);\n\n if (this.gameInstance && typeof this.gameInstance.destroy === 'function') {\n this.gameInstance.destroy();\n }\n\n this.isPlaying = false;\n this.gameInstance = null;\n this.container = null;\n\n const id = sessionId !== undefined ? sessionId : this.sessionId;\n if (id) {\n this.completeSession(score, id);\n }\n this.sessionId = null;\n }\n\n private async completeSession(score: number, sessionId: string): Promise<void> {\n try {\n await fetch(`${this.baseUrl}/sessions/${sessionId}/complete`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-api-key': this.apiKey\n },\n body: JSON.stringify({ duration: 0, score })\n });\n } catch (error) {\n console.error('Error completing game session:', error);\n }\n }\n} "],"names":["THEME_COLORS"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((t="undefined"!=typeof globalThis?globalThis:t||self).WaitlessAPI={})}(this,(function(t){"use strict";class i{constructor(t){this.isRunning=!1,this.score=0,this.container=t.container,this.theme=t.theme||"default",this.onScoreCallback=t.onScore}updateScore(t){this.score+=t,this.onScoreCallback&&"function"==typeof this.onScoreCallback&&this.onScoreCallback(this.score)}getScore(){return this.score}isActive(){return this.isRunning}}class e extends i{constructor(t){var i,e,s,n;super(t),this.grid=[],this.currentPiece=null,this.nextPiece=null,this.animationFrame=null,this.lastTime=0,this.dropInterval=1e3,this.dropCounter=0,this.shapes=[[[0,0,0,0],[1,1,1,1],[0,0,0,0],[0,0,0,0]],[[2,0,0],[2,2,2],[0,0,0]],[[0,0,3],[3,3,3],[0,0,0]],[[4,4],[4,4]],[[0,5,5],[5,5,0],[0,0,0]],[[0,6,0],[6,6,6],[0,0,0]],[[7,7,0],[0,7,7],[0,0,0]]],this.colors=["transparent","#00FFFF","#0000FF","#FF8000","#FFFF00","#00FF00","#8000FF","#FF0000"],this.handleKeyDown=t=>{if(this.isRunning)switch(t.key){case"ArrowLeft":this.movePiece(-1);break;case"ArrowRight":this.movePiece(1);break;case"ArrowDown":this.dropPiece();break;case"ArrowUp":this.rotatePiece();break;case" ":for(;!this.checkCollision();)this.currentPiece.pos.y++;this.currentPiece.pos.y--,this.mergePiece(),this.checkLines(),this.createPiece()}},this.blockSize="number"==typeof t.blockSize?t.blockSize:30;const a="number"==typeof t.width?t.width:300,h="number"==typeof t.height?t.height:600;this.cols=Math.floor(a/this.blockSize)||10,this.rows=Math.floor(h/this.blockSize)||20;const o="number"==typeof t.speed?t.speed:1;this.scoring=t.scoring&&"object"==typeof t.scoring?{singleLine:null!==(i=t.scoring.singleLine)&&void 0!==i?i:100,doubleLine:null!==(e=t.scoring.doubleLine)&&void 0!==e?e:300,tripleLine:null!==(s=t.scoring.tripleLine)&&void 0!==s?s:500,tetris:null!==(n=t.scoring.tetris)&&void 0!==n?n:800}:{singleLine:100,doubleLine:300,tripleLine:500,tetris:800},this.dropInterval=Math.max(100,1e3/o),this.canvas=document.createElement("canvas"),this.canvas.width=this.cols*this.blockSize,this.canvas.height=this.rows*this.blockSize,this.canvas.style.display="block",this.canvas.style.margin="0 auto",this.canvas.style.border="1px solid #333",this.container.appendChild(this.canvas);const r=this.canvas.getContext("2d");if(!r)throw new Error("Could not get canvas context");this.ctx=r,this.resetGrid(),this.setupControls()}start(){this.isRunning||(this.isRunning=!0,this.resetGrid(),this.createPiece(),this.lastTime=0,this.score=0,this.update(0))}pause(){this.isRunning&&this.animationFrame&&(this.isRunning=!1,cancelAnimationFrame(this.animationFrame),this.animationFrame=null)}resume(){this.isRunning||(this.isRunning=!0,this.lastTime=0,this.update(0))}destroy(){this.animationFrame&&(cancelAnimationFrame(this.animationFrame),this.animationFrame=null),window.removeEventListener("keydown",this.handleKeyDown),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.isRunning=!1}update(t){if(!this.isRunning)return;const i=t-this.lastTime;this.lastTime=t,this.dropCounter+=i,this.dropCounter>this.dropInterval&&this.dropPiece(),this.draw(),this.animationFrame=requestAnimationFrame(this.update.bind(this))}draw(){this.ctx.fillStyle="#000",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.drawGrid(),this.currentPiece&&this.drawPiece(this.currentPiece)}drawGrid(){for(let t=0;t<this.rows;t++)for(let i=0;i<this.cols;i++){const e=this.grid[t][i];0!==e&&(this.ctx.fillStyle=this.colors[e],this.ctx.fillRect(i*this.blockSize,t*this.blockSize,this.blockSize,this.blockSize),this.ctx.strokeStyle="#222",this.ctx.strokeRect(i*this.blockSize,t*this.blockSize,this.blockSize,this.blockSize))}}drawPiece(t){const{shape:i,pos:e}=t;for(let t=0;t<i.length;t++)for(let s=0;s<i[t].length;s++){const n=i[t][s];0!==n&&(this.ctx.fillStyle=this.colors[n],this.ctx.fillRect((e.x+s)*this.blockSize,(e.y+t)*this.blockSize,this.blockSize,this.blockSize),this.ctx.strokeStyle="#222",this.ctx.strokeRect((e.x+s)*this.blockSize,(e.y+t)*this.blockSize,this.blockSize,this.blockSize))}}resetGrid(){this.grid=Array(this.rows).fill(0).map((()=>Array(this.cols).fill(0)))}createPiece(){if(this.nextPiece)this.currentPiece=this.nextPiece,this.nextPiece=null;else{const t=Math.floor(Math.random()*this.shapes.length);this.currentPiece={shape:this.shapes[t],pos:{x:Math.floor(this.cols/2)-1,y:0}}}const t=Math.floor(Math.random()*this.shapes.length);this.nextPiece={shape:this.shapes[t],pos:{x:Math.floor(this.cols/2)-1,y:0}},this.checkCollision()&&(this.isRunning=!1,this.resetGrid())}dropPiece(){this.currentPiece.pos.y++,this.dropCounter=0,this.checkCollision()&&(this.currentPiece.pos.y--,this.mergePiece(),this.checkLines(),this.createPiece())}checkCollision(){const{shape:t,pos:i}=this.currentPiece;for(let e=0;e<t.length;e++)for(let s=0;s<t[e].length;s++)if(0!==t[e][s]){const t=i.x+s,n=i.y+e;if(t<0||t>=this.cols||n>=this.rows)return!0;if(n>=0&&0!==this.grid[n][t])return!0}return!1}mergePiece(){const{shape:t,pos:i}=this.currentPiece;for(let e=0;e<t.length;e++)for(let s=0;s<t[e].length;s++){const n=t[e][s];if(0!==n){const t=i.y+e,a=i.x+s;t>=0&&t<this.rows&&a>=0&&a<this.cols&&(this.grid[t][a]=n)}}}checkLines(){var t;let i=0;for(let t=this.rows-1;t>=0;t--)this.grid[t].every((t=>0!==t))&&(this.grid.splice(t,1),this.grid.unshift(Array(this.cols).fill(0)),i++,t++);if(i>0){const e=null!==(t=[0,this.scoring.singleLine,this.scoring.doubleLine,this.scoring.tripleLine,this.scoring.tetris][i])&&void 0!==t?t:this.scoring.tetris;this.updateScore(e)}}movePiece(t){this.currentPiece.pos.x+=t,this.checkCollision()&&(this.currentPiece.pos.x-=t)}rotatePiece(){const t=this.currentPiece.pos.x,i=[],e=this.currentPiece.shape;for(let t=0;t<e[0].length;t++){const s=[];for(let i=0;i<e.length;i++)s.push(e[e.length-1-i][t]);i.push(s)}this.currentPiece.shape=i;let s=1;for(;this.checkCollision();)if(this.currentPiece.pos.x+=s,s=-(s+(s>0?1:-1)),s>e[0].length)return this.currentPiece.shape=e,void(this.currentPiece.pos.x=t)}setupControls(){window.addEventListener("keydown",this.handleKeyDown)}}const s={default:{primary:"#333333",secondary:"#666666",accent:"#4caf50",text:"#222222"},cyberpunk:{primary:"#ff00ff",secondary:"#00ffff",accent:"#ffff00",text:"#ffffff"},minimal:{primary:"#000000",secondary:"#333333",accent:"#555555",text:"#111111"},corporate:{primary:"#3f51b5",secondary:"#7986cb",accent:"#ff4081",text:"#263238"}};class n extends i{constructor(t){super(t),this.snake=[],this.food=null,this.direction="right",this.nextDirection="right",this.animationFrame=null,this.lastTime=0,this.moveInterval=200,this.moveCounter=0,this.highScore=0,this.touchStartX=0,this.touchStartY=0,this.handleKeyDown=t=>{if(!this.isRunning)return;const i=this.nextDirection;switch(t.key){case"ArrowUp":"down"!==i&&(this.nextDirection="up");break;case"ArrowDown":"up"!==i&&(this.nextDirection="down");break;case"ArrowLeft":"right"!==i&&(this.nextDirection="left");break;case"ArrowRight":"left"!==i&&(this.nextDirection="right")}t.preventDefault()},this.handleTouchStart=t=>{t.touches.length>0&&(this.touchStartX=t.touches[0].clientX,this.touchStartY=t.touches[0].clientY)},this.handleTouchEnd=t=>{if(!this.isRunning||!t.changedTouches||0===t.changedTouches.length)return;const i=t.changedTouches[0].clientX-this.touchStartX,e=t.changedTouches[0].clientY-this.touchStartY;Math.abs(i)>Math.abs(e)?i>30&&"left"!==this.nextDirection?this.nextDirection="right":i<-30&&"right"!==this.nextDirection&&(this.nextDirection="left"):e>30&&"up"!==this.nextDirection?this.nextDirection="down":e<-30&&"down"!==this.nextDirection&&(this.nextDirection="up")},this.gridSize="number"==typeof t.gridSize?t.gridSize:20,this.foodValue="number"==typeof t.foodValue?t.foodValue:10;const i="number"==typeof t.width?t.width:400,e="number"==typeof t.height?t.height:400;this.gridWidth=this.gridSize,this.gridHeight=this.gridSize,this.cellSize=Math.max(10,Math.floor(Math.min(i,e)/this.gridSize))||20,this.moveInterval="number"==typeof t.speed&&t.speed>0?Math.max(80,200/t.speed):200,this.canvas=document.createElement("canvas"),this.canvas.width=this.gridWidth*this.cellSize,this.canvas.height=this.gridHeight*this.cellSize,this.canvas.style.display="block",this.canvas.style.margin="0 auto",this.canvas.style.border="1px solid #333",this.container.appendChild(this.canvas);const s=this.canvas.getContext("2d");if(!s)throw new Error("Could not get canvas context");this.ctx=s,this.setupControls()}getColors(){return s[this.theme]||s.default}start(){this.isRunning||(this.isRunning=!0,this.resetGame(),this.lastTime=0,this.score=0,this.moveInterval=200,this.update(0))}pause(){this.isRunning&&this.animationFrame&&(this.isRunning=!1,cancelAnimationFrame(this.animationFrame),this.animationFrame=null)}resume(){this.isRunning||(this.isRunning=!0,this.lastTime=0,this.update(0))}destroy(){this.animationFrame&&(cancelAnimationFrame(this.animationFrame),this.animationFrame=null),window.removeEventListener("keydown",this.handleKeyDown),window.removeEventListener("touchstart",this.handleTouchStart),window.removeEventListener("touchend",this.handleTouchEnd),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.isRunning=!1}update(t){if(!this.isRunning)return;const i=t-this.lastTime;this.lastTime=t,this.moveCounter+=i,this.moveCounter>=this.moveInterval&&(this.direction=this.nextDirection,this.moveSnake(),this.moveCounter=0),this.draw(),this.animationFrame=requestAnimationFrame(this.update.bind(this))}draw(){const t=this.getColors();this.ctx.fillStyle="#0a0a0a",this.ctx.fillRect(0,0,this.canvas.width,this.canvas.height),this.ctx.strokeStyle=t.text,this.ctx.globalAlpha=.15;for(let t=0;t<=this.gridWidth;t++)this.ctx.beginPath(),this.ctx.moveTo(t*this.cellSize,0),this.ctx.lineTo(t*this.cellSize,this.canvas.height),this.ctx.stroke();for(let t=0;t<=this.gridHeight;t++)this.ctx.beginPath(),this.ctx.moveTo(0,t*this.cellSize),this.ctx.lineTo(this.canvas.width,t*this.cellSize),this.ctx.stroke();this.ctx.globalAlpha=1,this.food&&(this.ctx.fillStyle=t.secondary,this.ctx.fillRect(this.food.x*this.cellSize+1,this.food.y*this.cellSize+1,this.cellSize-2,this.cellSize-2));for(let i=0;i<this.snake.length;i++){const e=this.snake[i],s=i===this.snake.length-1;this.ctx.fillStyle=s?t.accent:t.primary,this.ctx.fillRect(e.x*this.cellSize+1,e.y*this.cellSize+1,this.cellSize-2,this.cellSize-2)}this.ctx.fillStyle=t.text,this.ctx.font="14px Arial",this.ctx.fillText(`Score: ${this.score} High: ${this.highScore}`,8,18)}resetGame(){const t=Math.floor(this.gridWidth/2),i=Math.floor(this.gridHeight/2);this.snake=[{x:t-2,y:i},{x:t-1,y:i},{x:t,y:i}],this.direction="right",this.nextDirection="right",this.spawnFood()}spawnFood(){const t=[];for(let i=0;i<this.gridHeight;i++)for(let e=0;e<this.gridWidth;e++)this.snake.some((t=>t.x===e&&t.y===i))||t.push({x:e,y:i});0!==t.length?this.food=t[Math.floor(Math.random()*t.length)]:this.food=null}moveSnake(){const t=this.snake[this.snake.length-1];let i=t.x,e=t.y;switch(this.direction){case"up":e--;break;case"down":e++;break;case"left":i--;break;case"right":i++}i<0||i>=this.gridWidth||e<0||e>=this.gridHeight||this.snake.some((t=>t.x===i&&t.y===e))?this.gameOver():(this.snake.push({x:i,y:e}),this.food&&this.food.x===i&&this.food.y===e?(this.updateScore(this.foodValue),this.score>this.highScore&&(this.highScore=this.score),this.spawnFood(),this.moveInterval>80&&(this.moveInterval-=5)):this.snake.shift())}gameOver(){this.isRunning=!1,this.animationFrame&&(cancelAnimationFrame(this.animationFrame),this.animationFrame=null)}setupControls(){window.addEventListener("keydown",this.handleKeyDown),window.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),window.addEventListener("touchend",this.handleTouchEnd,{passive:!0})}}const a={default:{primary:"#333333",secondary:"#666666",accent:"#4caf50",text:"#222222"},cyberpunk:{primary:"#ff00ff",secondary:"#00ffff",accent:"#ffff00",text:"#ffffff"},minimal:{primary:"#000000",secondary:"#333333",accent:"#555555",text:"#111111"},corporate:{primary:"#3f51b5",secondary:"#7986cb",accent:"#ff4081",text:"#263238"}};class h extends i{constructor(t){super(t),this.bricks=[],this.animationFrame=null,this.lastTime=0,this.ballLaunched=!1,this.lives=3,this.level=1,this.highScore=0,this.paused=!1,this.paddleHeight=10,this.ballRadius=8,this.brickPadding=8,this.brickOffsetTop=50,this.handleMouseMove=t=>{const i=this.canvas.getBoundingClientRect(),e=this.canvas.width/i.width,s=(t.clientX-i.left)*e;this.paddle.x=Math.max(0,Math.min(this.width-this.paddle.width,s-this.paddle.width/2))},this.handleTouchMove=t=>{if(t.preventDefault(),t.touches.length>0){const i=this.canvas.getBoundingClientRect(),e=this.canvas.width/i.width,s=(t.touches[0].clientX-i.left)*e;this.paddle.x=Math.max(0,Math.min(this.width-this.paddle.width,s-this.paddle.width/2))}},this.handleClick=()=>{this.launchBall()},this.handleKeyDown=t=>{" "===t.key&&(t.preventDefault(),this.isRunning&&(this.paused?this.resume():this.pause()))},this.width="number"==typeof t.width?t.width:480,this.height="number"==typeof t.height?t.height:320,this.paddleWidth="number"==typeof t.paddleWidth?t.paddleWidth:100,this.brickRows="number"==typeof t.brickRows?t.brickRows:5,this.brickColumns="number"==typeof t.brickColumns?t.brickColumns:8,this.baseBallSpeed="number"==typeof t.ballSpeed&&t.ballSpeed>0?t.ballSpeed:5,this.canvas=document.createElement("canvas"),this.canvas.width=this.width,this.canvas.height=this.height,this.canvas.style.display="block",this.canvas.style.margin="0 auto",this.canvas.style.border="1px solid #333",this.container.appendChild(this.canvas);const i=this.canvas.getContext("2d");if(!i)throw new Error("Could not get canvas context");this.ctx=i,this.paddle={x:this.width/2-this.paddleWidth/2,y:this.height-25,width:this.paddleWidth,height:this.paddleHeight},this.ball={x:this.width/2,y:this.height-40,dx:0,dy:0,radius:this.ballRadius},this.setupControls()}getColors(){return a[this.theme]||a.default}start(){this.isRunning||(this.isRunning=!0,this.lives=3,this.level=1,this.score=0,this.ballLaunched=!1,this.baseBallSpeed=5,this.resetGame(),this.lastTime=0,this.update(0))}pause(){this.isRunning&&this.animationFrame&&(this.paused=!0,this.isRunning=!1,cancelAnimationFrame(this.animationFrame),this.animationFrame=null)}resume(){this.isRunning||(this.paused=!1,this.isRunning=!0,this.lastTime=0,this.update(0))}destroy(){this.animationFrame&&(cancelAnimationFrame(this.animationFrame),this.animationFrame=null),this.canvas.removeEventListener("mousemove",this.handleMouseMove),this.canvas.removeEventListener("touchmove",this.handleTouchMove),this.canvas.removeEventListener("click",this.handleClick),window.removeEventListener("keydown",this.handleKeyDown),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas),this.isRunning=!1}update(t){if(!this.isRunning)return this.draw(),void(this.animationFrame=requestAnimationFrame(this.update.bind(this)));const i=Math.min(t-this.lastTime,50);this.lastTime=t,!this.paused&&this.ballLaunched&&this.updateGameState(i),this.draw(),this.animationFrame=requestAnimationFrame(this.update.bind(this))}initBricks(){const t=this.getColors(),i=[t.primary,t.secondary,t.accent],e=(this.width-this.brickPadding*(this.brickColumns+1))/this.brickColumns;this.bricks=[];for(let t=0;t<this.brickRows;t++)for(let s=0;s<this.brickColumns;s++){const n=this.brickRows-t;this.bricks.push({x:this.brickPadding+s*(e+this.brickPadding),y:this.brickOffsetTop+t*(18+this.brickPadding),width:e,height:18,visible:!0,color:i[t%i.length],points:n})}}resetGame(){this.initBricks(),this.paddle.x=this.width/2-this.paddle.width/2,this.paddle.y=this.height-25,this.baseBallSpeed,this.ball.x=this.width/2,this.ball.y=this.height-40,this.ball.dx=0,this.ball.dy=0,this.ballLaunched=!1}launchBall(){if(this.ballLaunched)return;this.ballLaunched=!0;const t=this.baseBallSpeed;this.ball.dx=.6*t,this.ball.dy=-t}updateGameState(t){if(this.ball.x+=this.ball.dx,this.ball.y+=this.ball.dy,this.ball.x-this.ball.radius<0&&(this.ball.x=this.ball.radius,this.ball.dx=-this.ball.dx),this.ball.x+this.ball.radius>this.width&&(this.ball.x=this.width-this.ball.radius,this.ball.dx=-this.ball.dx),this.ball.y-this.ball.radius<0&&(this.ball.y=this.ball.radius,this.ball.dy=-this.ball.dy),this.ball.y+this.ball.radius>this.paddle.y&&this.ball.y-this.ball.radius<this.paddle.y+this.paddle.height&&this.ball.x>=this.paddle.x&&this.ball.x<=this.paddle.x+this.paddle.width){const t=(this.ball.x-(this.paddle.x+this.paddle.width/2))/(this.paddle.width/2);this.ball.dy=-Math.abs(this.ball.dy),this.ball.dx=.8*this.baseBallSpeed*t,this.ball.y=this.paddle.y-this.ball.radius}if(this.ball.y+this.ball.radius>this.height)return this.lives--,this.lives<=0?(this.isRunning=!1,void(this.score>this.highScore&&(this.highScore=this.score))):(this.ball.x=this.width/2,this.ball.y=this.height-40,this.ball.dx=0,this.ball.dy=0,void(this.ballLaunched=!1));for(const t of this.bricks)if(t.visible&&this.ball.x+this.ball.radius>t.x&&this.ball.x-this.ball.radius<t.x+t.width&&this.ball.y+this.ball.radius>t.y&&this.ball.y-this.ball.radius<t.y+t.height){t.visible=!1,this.updateScore(t.points),this.score>this.highScore&&(this.highScore=this.score),this.ball.dy=-this.ball.dy;break}0===this.bricks.filter((t=>t.visible)).length&&(this.level++,this.baseBallSpeed=Math.min(1.1*this.baseBallSpeed,2*this.baseBallSpeed),this.resetGame(),this.ballLaunched=!1)}draw(){const t=this.getColors();this.ctx.fillStyle="#0a0a12",this.ctx.fillRect(0,0,this.width,this.height),this.bricks.forEach((t=>{t.visible&&(this.ctx.fillStyle=t.color,this.ctx.fillRect(t.x,t.y,t.width,t.height))})),this.ctx.fillStyle=t.primary,this.ctx.fillRect(this.paddle.x,this.paddle.y,this.paddle.width,this.paddle.height),this.ctx.fillStyle=t.accent,this.ctx.beginPath(),this.ctx.arc(this.ball.x,this.ball.y,this.ball.radius,0,2*Math.PI),this.ctx.fill(),this.ctx.fillStyle=t.text,this.ctx.font="14px Arial",this.ctx.fillText(`Lives: ${this.lives} Score: ${this.score} High: ${this.highScore}`,8,22),this.ctx.fillText(`Level ${this.level}`,this.width-60,22);for(let i=0;i<this.lives;i++)this.ctx.beginPath(),this.ctx.arc(8+14*i,38,5,0,2*Math.PI),this.ctx.fillStyle=t.accent,this.ctx.fill();this.paused&&(this.ctx.fillStyle="rgba(0,0,0,0.6)",this.ctx.fillRect(0,0,this.width,this.height),this.ctx.fillStyle="#fff",this.ctx.font="24px Arial",this.ctx.textAlign="center",this.ctx.fillText("Paused - Press Space",this.width/2,this.height/2),this.ctx.textAlign="left"),!this.isRunning&&this.lives<=0&&(this.ctx.fillStyle="rgba(0,0,0,0.7)",this.ctx.fillRect(0,0,this.width,this.height),this.ctx.fillStyle="#fff",this.ctx.font="28px Arial",this.ctx.textAlign="center",this.ctx.fillText("Game Over",this.width/2,this.height/2-20),this.ctx.font="16px Arial",this.ctx.fillText(`Score: ${this.score}`,this.width/2,this.height/2+10),this.ctx.textAlign="left"),this.isRunning&&!this.ballLaunched&&(this.ctx.fillStyle="rgba(0,0,0,0.4)",this.ctx.font="14px Arial",this.ctx.textAlign="center",this.ctx.fillText("Click or tap to launch",this.width/2,this.height/2),this.ctx.textAlign="left")}setupControls(){this.canvas.addEventListener("mousemove",this.handleMouseMove),this.canvas.addEventListener("touchmove",this.handleTouchMove,{passive:!1}),this.canvas.addEventListener("click",this.handleClick),window.addEventListener("keydown",this.handleKeyDown)}}function o(t){const i={...t};var e,s;return t.game&&(e=t.game,!["tetris","snake","breakout"].includes(e))&&(console.warn(`Invalid game type: ${t.game}. Defaulting to tetris.`),i.game="tetris"),t.theme&&(s=t.theme,!["default","cyberpunk","minimal","corporate"].includes(s))&&(console.warn(`Invalid theme: ${t.theme}. Defaulting to default theme.`),i.theme="default"),t.message&&"string"!=typeof t.message&&(i.message=String(t.message)),t.width&&("number"!=typeof t.width||t.width<=0)&&delete i.width,t.height&&("number"!=typeof t.height||t.height<=0)&&delete i.height,i}class r{constructor(t){this.loadingOverlay=null,this.adBadge=null,this.container=t,this.adDisplayContainer=null,this.adsLoader=null,this.adsManager=null,this.videoElement=null,this.adContainer=null,this.setupElements()}setupElements(){this.videoElement=document.createElement("video"),this.videoElement.style.cssText="\n width: 100%;\n height: 100%;\n object-fit: contain;\n background: #000;\n ",this.adContainer=document.createElement("div");const t=Math.max(this.container.offsetWidth||1,1),i=Math.max(this.container.offsetHeight||1,1);this.adContainer.style.cssText=`\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n min-width: ${t}px;\n min-height: ${i}px;\n `,this.adContainer.appendChild(this.videoElement),this.adBadge=document.createElement("div"),this.adBadge.textContent="Ad",this.adBadge.style.cssText="\n position: absolute;\n top: 8px;\n right: 8px;\n font-size: 10px;\n font-family: sans-serif;\n color: rgba(255,255,255,0.9);\n background: rgba(0,0,0,0.5);\n padding: 2px 6px;\n border-radius: 2px;\n z-index: 10;\n display: none;\n ",this.adContainer.appendChild(this.adBadge),this.container.appendChild(this.adContainer)}showLoadingOverlay(){if(this.loadingOverlay&&this.loadingOverlay.parentNode)return;this.loadingOverlay=document.createElement("div"),this.loadingOverlay.setAttribute("aria-live","polite"),this.loadingOverlay.setAttribute("aria-label","Loading ad"),this.loadingOverlay.style.cssText="\n position: absolute;\n top: 0; left: 0;\n width: 100%; height: 100%;\n background: rgba(0,0,0,0.85);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 12px;\n z-index: 20;\n color: rgba(255,255,255,0.9);\n font-family: sans-serif;\n font-size: 14px;\n ";const t=document.createElement("div");t.style.cssText="\n width: 32px; height: 32px;\n border: 3px solid rgba(255,255,255,0.2);\n border-top-color: #fff;\n border-radius: 50%;\n animation: ad-spin 0.8s linear infinite;\n ";const i=document.createElement("style");i.textContent="@keyframes ad-spin { to { transform: rotate(360deg); } }",this.loadingOverlay.appendChild(i),this.loadingOverlay.appendChild(t);const e=document.createElement("span");e.textContent="Loading ad…",this.loadingOverlay.appendChild(e),this.container.appendChild(this.loadingOverlay)}removeLoadingOverlay(){this.loadingOverlay&&this.loadingOverlay.parentNode&&this.loadingOverlay.parentNode.removeChild(this.loadingOverlay),this.loadingOverlay=null}showErrorOverlay(t){this.removeLoadingOverlay();const i=document.createElement("div");i.setAttribute("aria-live","polite"),i.setAttribute("aria-label","Ad could not load"),i.style.cssText="\n position: absolute;\n top: 0; left: 0;\n width: 100%; height: 100%;\n background: rgba(0,0,0,0.9);\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 16px;\n z-index: 30;\n color: rgba(255,255,255,0.95);\n font-family: sans-serif;\n font-size: 14px;\n ";const e=document.createElement("p");e.textContent="Ad couldn't load",e.style.margin="0",i.appendChild(e);const s=document.createElement("button");s.textContent="Continue",s.style.cssText="\n padding: 8px 20px;\n font-size: 14px;\n cursor: pointer;\n background: rgba(255,255,255,0.2);\n color: #fff;\n border: 1px solid rgba(255,255,255,0.4);\n border-radius: 4px;\n ";const n=()=>{i.parentNode&&i.parentNode.removeChild(i),t()};s.addEventListener("click",n),i.appendChild(s),this.container.appendChild(i),setTimeout(n,3e3)}async playAd(t){return new Promise((i=>{var e;this.showLoadingOverlay();const s=()=>{this.showErrorOverlay((()=>{this.cleanup(),i()}))};(null===(e=window.google)||void 0===e?void 0:e.ima)?this.initializeAd(t,i,s):this.loadIMAScript().then((()=>this.initializeAd(t,i,s))).catch((()=>{var i;null===(i=t.onAdError)||void 0===i||i.call(t,new Error("Failed to load IMA SDK")),s()}))}))}loadIMAScript(){return new Promise(((t,i)=>{var e;if(null===(e=window.google)||void 0===e?void 0:e.ima)return void t();const s=document.createElement("script");s.src="https://imasdk.googleapis.com/js/sdkloader/ima3.js",s.async=!0,s.onload=()=>t(),s.onerror=()=>i(new Error("Failed to load IMA SDK")),document.head.appendChild(s)}))}initializeAd(t,i,e){var s;const n=window.google;if(!(null==n?void 0:n.ima))return null===(s=t.onAdError)||void 0===s||s.call(t,new Error("IMA SDK not available")),void e();this.adDisplayContainer=new n.ima.AdDisplayContainer(this.adContainer,this.videoElement),this.adsLoader=new n.ima.AdsLoader(this.adDisplayContainer),this.adsLoader.addEventListener(n.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(s=>this.onAdsManagerLoaded(s,t,i,e)),!1),this.adsLoader.addEventListener(n.ima.AdErrorEvent.Type.AD_ERROR,(e=>{var s;console.warn("Ad error:",e.getError()),null===(s=t.onAdError)||void 0===s||s.call(t,e.getError()),this.showErrorOverlay((()=>{this.cleanup(),i()}))}),!1);const a=new n.ima.AdsRequest;a.adTagUrl=t.adTagUrl,a.linearAdSlotWidth=this.container.offsetWidth,a.linearAdSlotHeight=this.container.offsetHeight,a.nonLinearAdSlotWidth=this.container.offsetWidth,a.nonLinearAdSlotHeight=this.container.offsetHeight,this.adDisplayContainer.initialize(),this.adsLoader.requestAds(a)}onAdsManagerLoaded(t,i,e,s){var n;const a=window.google;if(!(null==a?void 0:a.ima))return void e();const h=new a.ima.AdsRenderingSettings;h.restoreCustomPlaybackStateOnAdBreakComplete=!0,this.adsManager=t.getAdsManager(this.videoElement,h),this.adsManager.addEventListener(a.ima.AdErrorEvent.Type.AD_ERROR,(t=>{var s;console.warn("Ad manager error:",t.getError()),null===(s=i.onAdError)||void 0===s||s.call(i,t.getError()),this.showErrorOverlay((()=>{this.cleanup(),e()}))})),this.adsManager.addEventListener(a.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED,(()=>{var t;this.removeLoadingOverlay(),this.adBadge&&(this.adBadge.style.display="block"),null===(t=i.onAdStarted)||void 0===t||t.call(i)})),this.adsManager.addEventListener(a.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED,(()=>{var t;null===(t=i.onAdComplete)||void 0===t||t.call(i),this.cleanup(),e()})),this.adsManager.addEventListener(a.ima.AdEvent.Type.ALL_ADS_COMPLETED,(()=>{var t;null===(t=i.onAdComplete)||void 0===t||t.call(i),this.cleanup(),e()})),this.adsManager.addEventListener(a.ima.AdEvent.Type.SKIPPED,(()=>{var t;null===(t=i.onAdSkipped)||void 0===t||t.call(i),this.cleanup(),e()}));try{this.adsManager.init(this.container.offsetWidth,this.container.offsetHeight,a.ima.ViewMode.NORMAL),this.adsManager.start()}catch(t){console.warn("Ad start error:",t),null===(n=i.onAdError)||void 0===n||n.call(i,t),this.showErrorOverlay((()=>{this.cleanup(),e()}))}}cleanup(){if(this.adsManager){try{this.adsManager.destroy()}catch(t){}this.adsManager=null}if(this.adsLoader){try{this.adsLoader.destroy()}catch(t){}this.adsLoader=null}this.removeLoadingOverlay(),this.adContainer&&this.adContainer.parentNode&&this.adContainer.parentNode.removeChild(this.adContainer),this.adBadge=null}destroy(){this.cleanup()}}const l="waitless_config_";class d{constructor(t,i="https://api.waitlessapi.com"){var e;if(this.sessionId=null,this.container=null,this.gameInstance=null,this.isPlaying=!1,this.lastBackendConfig=null,this.config=null,this.configLoaded=!1,this.configPromise=null,this.batchIdsSeen=new Set,this.lastAdTime=0,this.adsThisSession=0,this.adsThisHour=0,this.lastHourStart=0,!t)throw new Error("API key is required");const s="string"==typeof i?i:null!==(e=null==i?void 0:i.apiBaseUrl)&&void 0!==e?e:"https://api.waitlessapi.com";this.apiKey=t,this.baseUrl=s,this.apiBaseUrl=s,this.defaultAdTagUrl="https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/single_ad_samples&sz=640x480&cust_params=sample_ct%3Dlinear&ciu_szs=300x250%2C728x90&gdfp_req=1&output=vast&unviewed_position_start=1&env=vp&impl=s&correlator=",this.configPromise=this.loadConfig(),[].forEach((t=>{(new Image).src=t}))}getDefaultConfig(){return{strategy:{preset:"balanced",behavior:"auto"},frequency:{minInterval:300,maxAdsPerSession:3,maxAdsPerHour:6},duration:{shortThreshold:10,longThreshold:60,adMaxDuration:15,enableGames:!0},batch:{enabled:!0,showAdOnce:!0},fallback:{type:"spinner",showMessage:!0},analytics:{trackEvents:!0,enableABTesting:!1}}}getCachedConfig(){try{const t="undefined"!=typeof localStorage?localStorage.getItem(l+this.apiKey):null;if(!t)return null;const{config:i,timestamp:e}=JSON.parse(t);return Date.now()-e>3e5?null:i}catch(t){return null}}cacheConfig(t){try{"undefined"!=typeof localStorage&&localStorage.setItem(l+this.apiKey,JSON.stringify({config:t,timestamp:Date.now()}))}catch(t){}}async loadConfig(){const t=this.getCachedConfig();if(t)return this.config=t,void(this.configLoaded=!0);try{const t=`${this.apiBaseUrl}/api/keys/${encodeURIComponent(this.apiKey)}/config`,i=await fetch(t);if(i.ok){const t=await i.json();this.config=t,this.cacheConfig(t)}else this.config=this.getDefaultConfig()}catch(t){this.config=this.getDefaultConfig()}this.configLoaded=!0}async ensureConfigLoaded(){!this.configLoaded&&this.configPromise&&await this.configPromise}async refreshConfig(){try{"undefined"!=typeof localStorage&&localStorage.removeItem(l+this.apiKey)}catch(t){}this.configLoaded=!1,this.configPromise=this.loadConfig(),await this.configPromise}getConfig(){return this.config}async showProcessing(t,i,e){const s=document.createElement("div");s.style.cssText="position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.7);display:flex;flex-direction:column;align-items:center;justify-content:center;";const n=document.createElement("div");n.textContent=e||"Processing...",n.style.cssText="color:#fff;font-size:18px;margin-top:12px;";const a=document.createElement("div");if(a.style.cssText="width:40px;height:40px;border:3px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:waitless-spin 0.8s linear infinite;",!document.getElementById("waitless-spinner-style")){const t=document.createElement("style");t.id="waitless-spinner-style",t.textContent="@keyframes waitless-spin { to { transform: rotate(360deg); } }",document.head.appendChild(t)}s.appendChild(a),s.appendChild(n),document.body.appendChild(s);try{return await t()}finally{s.remove()}}shouldShowAd(t){var i,e,s;if(!t)return!0;const n=Date.now(),a=1e3*(null!==(i=t.minInterval)&&void 0!==i?i:300);if(n-this.lastAdTime<a)return!1;const h=null!==(e=t.maxAdsPerSession)&&void 0!==e?e:3;if(this.adsThisSession>=h)return!1;const o=36e5,r=Math.floor(n/o)*o;r!==this.lastHourStart&&(this.lastHourStart=r,this.adsThisHour=0);const l=null!==(s=t.maxAdsPerHour)&&void 0!==s?s:6;return!(this.adsThisHour>=l)}recordAdShown(){this.lastAdTime=Date.now(),this.adsThisSession+=1,this.adsThisHour+=1}async showAd(t,i={}){var e,s,n,a,h,r,l,d,c,u,g,p,f,m,y,v,x;if(!t||"function"!=typeof t)throw new Error("Processing function is required and must be a function");await this.ensureConfigLoaded();const b=null!==(e=this.config)&&void 0!==e?e:this.getDefaultConfig(),w={...b,strategy:{...b.strategy,...null===(s=i.overrideConfig)||void 0===s?void 0:s.strategy},frequency:{...b.frequency,...null===(n=i.overrideConfig)||void 0===n?void 0:n.frequency},duration:{...b.duration,...null===(a=i.overrideConfig)||void 0===a?void 0:a.duration},batch:{...b.batch,...null===(h=i.overrideConfig)||void 0===h?void 0:h.batch},fallback:{...b.fallback,...null===(r=i.overrideConfig)||void 0===r?void 0:r.fallback},analytics:{...b.analytics,...null===(l=i.overrideConfig)||void 0===l?void 0:l.analytics}},S=null!==(d=w.batch)&&void 0!==d?d:{},k=null!==(c=w.frequency)&&void 0!==c?c:{},C=null!==(g=(null!==(u=w.strategy)&&void 0!==u?u:{}).behavior)&&void 0!==g?g:"auto",A=null!==(p=w.duration)&&void 0!==p?p:{},E=null!==(f=i.message)&&void 0!==f?f:"Loading...";if(i.batchId&&S.enabled&&S.showAdOnce&&this.batchIdsSeen.has(i.batchId))return this.showProcessing(t,"spinner",E);if(!this.shouldShowAd(k))return this.showProcessing(t,"spinner",E);const T=null!==(m=A.shortThreshold)&&void 0!==m?m:10,I=null!==(y=A.longThreshold)&&void 0!==y?y:60,P=null!==(v=i.estimatedDuration)&&void 0!==v?v:0,L=!1!==A.enableGames;let D="ad-only";if("game-only"===C||L&&P>I?D="game-only":L&&P>T&&P<=I&&(D="ad-plus-game"),i.batchId&&S.enabled&&S.showAdOnce&&this.batchIdsSeen.add(i.batchId),"game-only"===D)return this.showGame(t,{message:E});const R=o({container:void 0,message:E}),M=await this.createSession(R),{container:z,overlay:F}=this.initializeGameUI(R),O=null!==(x=A.adMaxDuration)&&void 0!==x?x:15;try{if(M.sessionId&&(await this.playAdInContainer(z,{adTagUrl:this.defaultAdTagUrl,maxDuration:O,sessionId:M.sessionId}),this.recordAdShown()),"ad-plus-game"===D){const i=this.startGame(R),e=await t();return this.endGame(M.sessionId),this.cleanup(F,i),e}z.innerHTML="";const i=document.createElement("div");i.style.cssText="width:40px;height:40px;border:3px solid rgba(255,255,255,0.3);border-top-color:#fff;border-radius:50%;animation:waitless-spin 0.8s linear infinite;margin:auto;";const e=document.createElement("div");if(e.textContent=E,e.style.cssText="color:#fff;font-size:18px;margin-top:12px;text-align:center;",z.style.display="flex",z.style.flexDirection="column",z.style.alignItems="center",z.style.justifyContent="center",z.appendChild(i),z.appendChild(e),!document.getElementById("waitless-spinner-style")){const t=document.createElement("style");t.id="waitless-spinner-style",t.textContent="@keyframes waitless-spin { to { transform: rotate(360deg); } }",document.head.appendChild(t)}const s=await t();return this.endGame(M.sessionId),this.cleanup(F,null),s}catch(t){throw this.endGame(M.sessionId),this.cleanup(F,null),t}}async showGame(t,i={}){if(!t||"function"!=typeof t)throw new Error("Processing function is required and must be a function");const e=!1!==i.showAds&&"demo"!==this.apiKey,s=i.adPlacement||"pre-game",n=o(i),a=await this.createSession(n),{container:h,overlay:r}=this.initializeGameUI(n);let l=null;try{e&&a.sessionId&&("pre-game"===s||"both"===s)&&await this.playAdInContainer(h,{adTagUrl:i.adTagUrl||this.defaultAdTagUrl,maxDuration:i.adDuration||15,sessionId:a.sessionId}),l=this.startGame(n);const o=await t();return e&&a.sessionId&&("post-game"===s||"both"===s)&&await this.playAdInContainer(h,{adTagUrl:i.adTagUrl||this.defaultAdTagUrl,maxDuration:i.adDuration||15,sessionId:a.sessionId}),this.endGame(a.sessionId),this.cleanup(r,l),o}catch(t){throw this.endGame(a.sessionId),this.cleanup(r,l||this.gameInstance),t}}async createSession(t){if("demo"===this.apiKey)return this.sessionId=null,this.lastBackendConfig=null,{sessionId:null,config:null};try{const i=await fetch(`${this.baseUrl}/sessions`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey},body:JSON.stringify({game:t.game,theme:t.theme,message:t.message})});if(!i.ok)throw new Error(`Failed to create game session: ${i.statusText}`);const e=await i.json();return this.sessionId=e.sessionId,this.lastBackendConfig=e.config&&"object"==typeof e.config?e.config:null,{sessionId:this.sessionId,config:this.lastBackendConfig}}catch(t){return console.error("Error creating WaitlessAPI session:",t),this.sessionId=null,this.lastBackendConfig=null,{sessionId:null,config:null}}}initializeGameUI(t){let i=null;if(t.container)if("string"==typeof t.container){if(this.container=document.querySelector(t.container),!this.container)throw new Error(`Container element not found: ${t.container}`)}else this.container=t.container;else this.container=document.createElement("div"),this.container.id="waitless-game-container",this.container.style.position="fixed",this.container.style.top="0",this.container.style.left="0",this.container.style.width="100%",this.container.style.height="100%",this.container.style.zIndex="9999",document.body.appendChild(this.container),i=this.container;t.width&&(this.container.style.width=`${t.width}px`),t.height&&(this.container.style.height=`${t.height}px`);const e=document.createElement("div");return e.id="waitless-message",e.textContent=t.message||"Loading...",e.style.position="absolute",e.style.bottom="20px",e.style.left="0",e.style.width="100%",e.style.textAlign="center",e.style.color="#ffffff",e.style.fontSize="18px",e.style.fontFamily="Arial, sans-serif",e.style.padding="10px",this.container.appendChild(e),{container:this.container,overlay:i}}startGame(t){if(!this.container)return null;const i={container:this.container,theme:t.theme||"default",onScore:t.onScore};return null!=t.width&&(i.width=t.width),null!=t.height&&(i.height=t.height),this.lastBackendConfig&&Object.assign(i,this.lastBackendConfig),this.gameInstance=function(t,i){switch(t){case"tetris":default:return new e(i);case"snake":return new n(i);case"breakout":return new h(i)}}(t.game||"tetris",i),this.gameInstance&&"function"==typeof this.gameInstance.start&&this.gameInstance.start(),this.isPlaying=!0,t.onStart&&"function"==typeof t.onStart&&t.onStart(),this.gameInstance}async playAdInContainer(t,i){if(null===i.sessionId)return;const e=new r(t),s=Date.now();try{await e.playAd({adTagUrl:i.adTagUrl,maxDuration:i.maxDuration,onAdStarted:()=>{this.trackAdEvent(i.sessionId,"ad_started")},onAdComplete:()=>{const t=(Date.now()-s)/1e3;this.trackAdEvent(i.sessionId,"ad_completed",{duration:t})},onAdSkipped:()=>{const t=(Date.now()-s)/1e3;this.trackAdEvent(i.sessionId,"ad_skipped",{duration:t})},onAdError:t=>{this.trackAdEvent(i.sessionId,"ad_error",{error:String(t)})}})}catch(t){console.warn("Ad loading failed, continuing:",t)}finally{e.destroy()}}async trackAdEvent(t,i,e){try{await fetch(`${this.baseUrl}/sessions/${t}/ad-event`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey},body:JSON.stringify({event:i,timestamp:Date.now(),...e})})}catch(t){console.warn("Failed to track ad event:",t)}}cleanup(t,i){t&&t.parentNode&&t.parentNode.removeChild(t),this.container=null,this.gameInstance=null,this.isPlaying=!1}endGame(t){var i,e;if(!this.isPlaying&&!this.gameInstance)return;const s=this.gameInstance&&"function"==typeof this.gameInstance.getScore?this.gameInstance.getScore():null!==(e=null===(i=this.gameInstance)||void 0===i?void 0:i.score)&&void 0!==e?e:0;this.gameInstance&&"function"==typeof this.gameInstance.destroy&&this.gameInstance.destroy(),this.isPlaying=!1,this.gameInstance=null,this.container=null;const n=void 0!==t?t:this.sessionId;n&&this.completeSession(s,n),this.sessionId=null}async completeSession(t,i){try{await fetch(`${this.baseUrl}/sessions/${i}/complete`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":this.apiKey},body:JSON.stringify({duration:0,score:t})})}catch(t){console.error("Error completing game session:",t)}}}t.AdPlayer=r,t.WaitlessAPI=d,t.default=d,Object.defineProperty(t,"__esModule",{value:!0})}));
|
|
2
|
+
//# sourceMappingURL=index.js.map
|