@minicode-dev/chat 0.1.6 → 0.1.8

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.
Files changed (69) hide show
  1. package/README.md +25 -0
  2. package/assets/sounds/tanks/big_explosion.mp3 +0 -0
  3. package/assets/sounds/tanks/big_explosion.ogg +0 -0
  4. package/assets/sounds/tanks/cannon_fire.mp3 +0 -0
  5. package/assets/sounds/tanks/cannon_fire.ogg +0 -0
  6. package/assets/sounds/tanks/defeat.mp3 +0 -0
  7. package/assets/sounds/tanks/defeat.ogg +0 -0
  8. package/assets/sounds/tanks/engine_loop.mp3 +0 -0
  9. package/assets/sounds/tanks/engine_loop.ogg +0 -0
  10. package/assets/sounds/tanks/engine_start.mp3 +0 -0
  11. package/assets/sounds/tanks/engine_start.ogg +0 -0
  12. package/assets/sounds/tanks/projectile_whistle.mp3 +0 -0
  13. package/assets/sounds/tanks/projectile_whistle.ogg +0 -0
  14. package/assets/sounds/tanks/tank_destroyed.mp3 +0 -0
  15. package/assets/sounds/tanks/tank_destroyed.ogg +0 -0
  16. package/assets/sounds/tanks/tank_hit.mp3 +0 -0
  17. package/assets/sounds/tanks/tank_hit.ogg +0 -0
  18. package/assets/sounds/tanks/terrain_impact.mp3 +0 -0
  19. package/assets/sounds/tanks/terrain_impact.ogg +0 -0
  20. package/assets/sounds/tanks/tracks_loop.mp3 +0 -0
  21. package/assets/sounds/tanks/tracks_loop.ogg +0 -0
  22. package/assets/sounds/tanks/turret_loop.mp3 +0 -0
  23. package/assets/sounds/tanks/turret_loop.ogg +0 -0
  24. package/assets/sounds/tanks/victory.mp3 +0 -0
  25. package/assets/sounds/tanks/victory.ogg +0 -0
  26. package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js → BattleshipGameCard-BFqA0cjT.js} +67 -65
  27. package/dist/chunks/{BattleshipGameCard-S-UdM6rn.js.map → BattleshipGameCard-BFqA0cjT.js.map} +1 -1
  28. package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js → BattleshipPrototype-CmQd5AUO.js} +4 -3
  29. package/dist/chunks/{BattleshipPrototype-Dm6U_mCr.js.map → BattleshipPrototype-CmQd5AUO.js.map} +1 -1
  30. package/dist/chunks/ChatContext-dty_KPDX.js +90 -0
  31. package/dist/chunks/ChatContext-dty_KPDX.js.map +1 -0
  32. package/dist/chunks/TanksGameCard-D0n-lzTs.js +1535 -0
  33. package/dist/chunks/TanksGameCard-D0n-lzTs.js.map +1 -0
  34. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js +849 -0
  35. package/dist/chunks/TanksLiveGameCard-BmNRXP66.js.map +1 -0
  36. package/dist/chunks/WebRtcLab-B7xBlJy1.js +510 -0
  37. package/dist/chunks/WebRtcLab-B7xBlJy1.js.map +1 -0
  38. package/dist/chunks/{battleship-DXKuIZ1I.js → board-DXKuIZ1I.js} +1 -1
  39. package/dist/chunks/board-DXKuIZ1I.js.map +1 -0
  40. package/dist/chunks/connect4Sounds-BN7d_TM2.js +3235 -0
  41. package/dist/chunks/connect4Sounds-BN7d_TM2.js.map +1 -0
  42. package/dist/chunks/core-geo-UJY-tH9L.js +361 -0
  43. package/dist/chunks/core-geo-UJY-tH9L.js.map +1 -0
  44. package/dist/chunks/createBattleScene-L4ZRWDED.js +1265 -0
  45. package/dist/chunks/createBattleScene-L4ZRWDED.js.map +1 -0
  46. package/dist/chunks/createLiveScene-CtYPcOPo.js +364 -0
  47. package/dist/chunks/createLiveScene-CtYPcOPo.js.map +1 -0
  48. package/dist/chunks/createPeerLink-qei05vpV.js +478 -0
  49. package/dist/chunks/createPeerLink-qei05vpV.js.map +1 -0
  50. package/dist/chunks/createTankScene-CV7Brxmt.js +685 -0
  51. package/dist/chunks/createTankScene-CV7Brxmt.js.map +1 -0
  52. package/dist/chunks/fx-BHsl4S_J.js +1470 -0
  53. package/dist/chunks/fx-BHsl4S_J.js.map +1 -0
  54. package/dist/chunks/gameStatus-Cu1Z8un9.js +69 -0
  55. package/dist/chunks/gameStatus-Cu1Z8un9.js.map +1 -0
  56. package/dist/chunks/signalFaults-Dv2YjjKy.js +36 -0
  57. package/dist/chunks/signalFaults-Dv2YjjKy.js.map +1 -0
  58. package/dist/chunks/tanksSounds-C99OD2xD.js +177 -0
  59. package/dist/chunks/tanksSounds-C99OD2xD.js.map +1 -0
  60. package/dist/index.js +2404 -2427
  61. package/dist/index.js.map +1 -1
  62. package/dist/styles.css +1 -1
  63. package/index.d.ts +63 -0
  64. package/package.json +1 -1
  65. package/dist/chunks/battleship-DXKuIZ1I.js.map +0 -1
  66. package/dist/chunks/connect4Sounds-9u0p-dAf.js +0 -1847
  67. package/dist/chunks/connect4Sounds-9u0p-dAf.js.map +0 -1
  68. package/dist/chunks/createBattleScene-HIAvjixn.js +0 -1621
  69. package/dist/chunks/createBattleScene-HIAvjixn.js.map +0 -1
package/index.d.ts CHANGED
@@ -87,6 +87,10 @@ export interface ChatGamesFeatures {
87
87
  connect4?: boolean;
88
88
  battleship?: boolean;
89
89
  battleshipPreview?: boolean;
90
+ /** Tanques de guerra 3D. Default false while the game is in preview. */
91
+ tanks?: boolean;
92
+ /** Simultaneous WebRTC tank combat; disabled by default. */
93
+ tanksLive?: boolean;
90
94
  }
91
95
 
92
96
  export interface ChatFeatures {
@@ -164,7 +168,14 @@ export interface ChatCallbacks {
164
168
  onConnectionChange?: (status: TransportStatus) => void;
165
169
  }
166
170
 
171
+ export interface ChatWebRtcConfig {
172
+ /** Host supplied STUN/TURN configuration. Obtain TURN credentials at runtime. */
173
+ iceServers?: RTCIceServer[];
174
+ iceTransportPolicy?: 'all' | 'relay';
175
+ }
176
+
167
177
  export interface ChatConfig {
178
+ webrtc?: ChatWebRtcConfig;
168
179
  websocket?: {
169
180
  url?: string | (() => string | Promise<string>) | null;
170
181
  reconnect?: ReconnectOptions;
@@ -505,3 +516,55 @@ export function sendRelayMessage(socket: WebSocket | null, roomId: string, messa
505
516
 
506
517
  /** Lazily loads the Battleship 3D preview (three.js); use with React.lazy. */
507
518
  export function loadBattleshipPreview(): Promise<{ default: ComponentType<any> }>;
519
+
520
+ // ---- WebRTC (chat-signaled peer links, TANQUES LIVE groundwork) ----
521
+
522
+ export interface ChatSignalFrame { userId: string; roomId: string; text: string }
523
+ export interface PeerSignaling {
524
+ send(text: string): Promise<unknown> | unknown;
525
+ subscribe(listener: (frame: ChatSignalFrame) => void): () => void;
526
+ dispose?(): void;
527
+ }
528
+ export type PeerLinkPhase = 'idle' | 'listening' | 'calling' | 'negotiating' | 'connected' | 'restarting' | 'reconnecting' | 'failed';
529
+ export interface PeerLinkState {
530
+ phase: PeerLinkPhase; role: 'caller' | 'answerer' | null; sid: string | null; gen: number;
531
+ tabId: string; peerTab: string | null; ice: string; connection: string; signalingState: string; gathering: string;
532
+ route: { local: string | null; remote: string | null; protocol: string | null; relay: boolean; label: string } | null;
533
+ rtt: number | null; statsRtt: number | null; reconnects: number; restarts: number; error: string | null;
534
+ move: { sent: number; dropped: number; received: number; outOfOrder: number; lossPct: number; hzIn: number; hzOut: number };
535
+ signals: { sent: number; received: number; retransmits: number; duplicates: number; ignored: number; invalid: number; tooLarge: number; maxLength: number };
536
+ events: { sent: number; received: number };
537
+ }
538
+ export interface PeerLink {
539
+ tabId: string;
540
+ connect(): void;
541
+ setListening(value: boolean): void;
542
+ sendMove(payload: unknown): boolean;
543
+ sendEvent(payload: unknown): boolean;
544
+ restartIce(): void;
545
+ getState(): PeerLinkState;
546
+ hangup(): void;
547
+ destroy(): void;
548
+ }
549
+ export function createPeerLink(options: {
550
+ signaling: PeerSignaling; selfId: string; peerId: string; roomId?: string | null; tabId?: string;
551
+ iceServers?: RTCIceServer[]; iceTransportPolicy?: RTCIceTransportPolicy; autoReconnect?: boolean; listen?: boolean;
552
+ RTCPeerConnectionImpl?: typeof RTCPeerConnection;
553
+ onChange?: (state: PeerLinkState) => void; onMove?: (payload: any, meta: { seq: number }) => void;
554
+ onEvent?: (payload: any) => void; log?: (line: string) => void;
555
+ }): PeerLink;
556
+ export const DEFAULT_ICE_SERVERS: RTCIceServer[];
557
+ export const rtcSignals: { emit(frame: ChatSignalFrame): void; subscribe(listener: (frame: ChatSignalFrame) => void): () => void };
558
+ export function createChatSignaling(options: { send: (roomId: string, text: string) => Promise<unknown> | unknown; roomId: string }): PeerSignaling;
559
+ export function withSignalFaults(signaling: PeerSignaling, getFaults?: () => { drop?: number; duplicate?: number; jitter?: number }): PeerSignaling & { pause(ms: number): void; dispose(): void };
560
+ export const WEBRTC_PREFIX: 'LIRA_WEBRTC_V1:';
561
+ export const MAX_SIGNAL_LENGTH: number;
562
+ export function isWebrtcMessage(text: unknown): boolean;
563
+ export function encodeSignal(signal: Record<string, unknown>): string | null;
564
+ export function decodeSignal(text: string): Record<string, any> | null;
565
+ /** Lazy lab UI; render inside <Suspense>. */
566
+ export const WebRtcLab: ComponentType<{
567
+ selfId: string | null; selfName?: string; peers?: { id: string; name?: string }[]; defaultPeerId?: string;
568
+ createSignaling: (opts: { peerId: string; log: (line: string) => void }) => PeerSignaling | Promise<PeerSignaling>;
569
+ socketStatus?: string; disabledReason?: string; title?: string; children?: ReactNode; iceServers?: RTCIceServer[];
570
+ }>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@minicode-dev/chat",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "private": false,
5
5
  "description": "LIRA real-time chat (WebSocket, media, games) as a React package.",
6
6
  "author": "Minicode",
@@ -1 +0,0 @@
1
- {"version":3,"file":"battleship-DXKuIZ1I.js","names":["FLEET","matrix","fail","isCell","cell","createBoard","validatePlacement","placement","definition","ship","shipId","board","orientation","cells","row","index","col","placeShip","validation","grid","removeShip","item","shot","isFleetComplete","isShipSunk","isFleetSunk","fireShot","result","shots","nextBoard"],"sources":["../../src/games/battleship/logic/board.js"],"sourcesContent":["/** Pure board rules. Coordinates are zero-based { row, col }. Ships may touch. */\nexport const BOARD_SIZE = 10;\nexport const RULES_VERSION = 1;\nexport const FLEET = Object.freeze([\n Object.freeze({ id: 'carrier', size: 5 }),\n Object.freeze({ id: 'battleship', size: 4 }),\n Object.freeze({ id: 'cruiser', size: 3 }),\n Object.freeze({ id: 'submarine', size: 3 }),\n Object.freeze({ id: 'destroyer', size: 2 }),\n]);\nconst matrix = () => Array.from({ length: BOARD_SIZE }, () => Array(BOARD_SIZE).fill(null));\nconst fail = (reason) => ({ ok: false, reason });\n\nexport function isCell(cell) {\n return cell != null && Number.isInteger(cell.row) && Number.isInteger(cell.col)\n && cell.row >= 0 && cell.row < BOARD_SIZE && cell.col >= 0 && cell.col < BOARD_SIZE;\n}\n\nexport function createBoard() {\n return { grid: matrix(), shots: matrix(), ships: [] };\n}\n\nexport function validatePlacement(board, placement) {\n if (!placement || typeof placement !== 'object') return fail('invalid_placement');\n const { shipId, row, col, orientation } = placement;\n const definition = FLEET.find((ship) => ship.id === shipId);\n if (!definition) return fail('unknown_ship');\n if (board.ships.some((ship) => ship.id === shipId)) return fail('already_placed');\n if (orientation !== 'horizontal' && orientation !== 'vertical') return fail('invalid_orientation');\n if (!isCell({ row, col })) return fail('out_of_bounds');\n const cells = Array.from({ length: definition.size }, (_, index) => ({\n row: row + (orientation === 'vertical' ? index : 0),\n col: col + (orientation === 'horizontal' ? index : 0),\n }));\n if (cells.some((cell) => !isCell(cell))) return fail('out_of_bounds');\n if (cells.some((cell) => board.grid[cell.row][cell.col] !== null)) return fail('overlap');\n return { ok: true, ship: { id: shipId, size: definition.size, orientation, cells } };\n}\n\nexport function placeShip(board, placement) {\n const validation = validatePlacement(board, placement);\n if (!validation.ok) return validation;\n const grid = board.grid.map((row) => row.slice());\n const { ship } = validation;\n for (const cell of ship.cells) grid[cell.row][cell.col] = ship.id;\n return { ok: true, board: { ...board, grid, ships: [...board.ships, ship] }, ship };\n}\n\nexport function removeShip(board, shipId) {\n const ship = board.ships.find((item) => item.id === shipId);\n if (!ship) return fail('unknown_ship');\n if (board.shots.some((row) => row.some((shot) => shot !== null))) return fail('battle_started');\n const grid = board.grid.map((row) => row.slice());\n for (const cell of ship.cells) grid[cell.row][cell.col] = null;\n return { ok: true, board: { ...board, grid, ships: board.ships.filter((item) => item.id !== shipId) } };\n}\n\nexport function isFleetComplete(board) {\n return board.ships.length === FLEET.length && FLEET.every((definition) => {\n const ship = board.ships.find((item) => item.id === definition.id);\n return ship?.size === definition.size && ship.cells.length === definition.size;\n });\n}\n\nexport function isShipSunk(board, shipId) {\n const ship = board.ships.find((item) => item.id === shipId);\n return Boolean(ship && ship.cells.every((cell) => board.shots[cell.row][cell.col] === 'hit'));\n}\n\nexport function isFleetSunk(board) {\n return isFleetComplete(board) && board.ships.every((ship) => isShipSunk(board, ship.id));\n}\n\nexport function fireShot(board, cell) {\n if (!isCell(cell)) return fail('out_of_bounds');\n if (board.shots[cell.row][cell.col] !== null) return fail('repeat_shot');\n if (isFleetSunk(board)) return fail('battle_finished');\n const shipId = board.grid[cell.row][cell.col];\n const result = shipId === null ? 'miss' : 'hit';\n const shots = board.shots.map((row) => row.slice());\n shots[cell.row][cell.col] = result;\n const nextBoard = { ...board, shots };\n return {\n ok: true, board: nextBoard, result, shipId,\n sunk: shipId !== null && isShipSunk(nextBoard, shipId),\n defeated: isFleetSunk(nextBoard),\n };\n}\n"],"mappings":"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"}