@primitiv/client 0.18.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/LICENSE.txt +285 -0
- package/README.md +34 -0
- package/dist/audio.cjs +1 -0
- package/dist/audio.d.ts +1 -0
- package/dist/audio.mjs +1 -0
- package/dist/core.cjs +4 -0
- package/dist/core.d.ts +1 -0
- package/dist/core.mjs +4 -0
- package/dist/index.cjs +204 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.mjs +204 -0
- package/dist/input.cjs +1 -0
- package/dist/input.d.ts +1 -0
- package/dist/input.mjs +1 -0
- package/dist/network.cjs +1 -0
- package/dist/network.d.ts +2 -0
- package/dist/network.mjs +1 -0
- package/dist/render.cjs +204 -0
- package/dist/render.d.ts +1 -0
- package/dist/render.mjs +204 -0
- package/dist/types.cjs +1 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.mjs +1 -0
- package/package.json +86 -0
package/dist/input.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var A=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var J=Object.prototype.hasOwnProperty;var V=(e,t)=>{for(var s in t)A(e,s,{get:t[s],enumerable:!0})},U=(e,t,s,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of N(t))!J.call(e,a)&&a!==s&&A(e,a,{get:()=>t[a],enumerable:!(o=j(t,a))||o.enumerable});return e};var W=e=>U(A({},"__esModule",{value:!0}),e);var he={};V(he,{BaseInputs:()=>v,GamepadInputs:()=>I,InputCollector:()=>ue,InputRouter:()=>ae,KeyboardInputs:()=>Y,MobileVibration:()=>z,MotionInputs:()=>C,MouseInputs:()=>X,TouchInputs:()=>K,TouchZoneInputs:()=>L,VibrationPatterns:()=>g,getMobileVibration:()=>re});module.exports=W(he);var m=class l{x;y;constructor(t=0,s=0){this.x=t,this.y=s}static zero(){return new l(0,0)}static one(){return new l(1,1)}static up(){return new l(0,-1)}static down(){return new l(0,1)}static left(){return new l(-1,0)}static right(){return new l(1,0)}add(t){return new l(this.x+t.x,this.y+t.y)}subtract(t){return new l(this.x-t.x,this.y-t.y)}multiply(t){return new l(this.x*t,this.y*t)}divide(t){if(t===0)throw new Error("Division by zero");return new l(this.x/t,this.y/t)}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}lengthSquared(){return this.x*this.x+this.y*this.y}normalize(){let t=this.length();return t===0?l.zero():this.divide(t)}distance(t){return this.subtract(t).length()}distanceSquared(t){return this.subtract(t).lengthSquared()}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}angle(){return Math.atan2(this.y,this.x)}angleTo(t){return Math.atan2(t.y-this.y,t.x-this.x)}rotate(t){let s=Math.cos(t),o=Math.sin(t);return new l(this.x*s-this.y*o,this.x*o+this.y*s)}lerp(t,s){return new l(this.x+(t.x-this.x)*s,this.y+(t.y-this.y)*s)}clone(){return new l(this.x,this.y)}equals(t){return this.x===t.x&&this.y===t.y}toString(){return`Vector2(${this.x}, ${this.y})`}toArray(){return[this.x,this.y]}set(t,s){return this.x=t,this.y=s,this}copy(t){return this.x=t.x,this.y=t.y,this}addInPlace(t){return this.x+=t.x,this.y+=t.y,this}subtractInPlace(t){return this.x-=t.x,this.y-=t.y,this}multiplyInPlace(t){return this.x*=t,this.y*=t,this}divideInPlace(t){if(t===0)throw new Error("Division by zero");return this.x/=t,this.y/=t,this}normalizeInPlace(){let t=this.length();return t===0?(this.x=0,this.y=0):(this.x/=t,this.y/=t),this}};var n=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e[e.Gamepad=2]="Gamepad",e[e.Touch=3]="Touch",e[e.TVRemote=4]="TVRemote",e[e.TextInput=5]="TextInput",e[e.Motion=6]="Motion",e[e.TouchZone=7]="TouchZone",e))(n||{}),M=(e=>(e[e.KeyA=0]="KeyA",e[e.KeyB=1]="KeyB",e[e.KeyC=2]="KeyC",e[e.KeyD=3]="KeyD",e[e.KeyE=4]="KeyE",e[e.KeyF=5]="KeyF",e[e.KeyG=6]="KeyG",e[e.KeyH=7]="KeyH",e[e.KeyI=8]="KeyI",e[e.KeyJ=9]="KeyJ",e[e.KeyK=10]="KeyK",e[e.KeyL=11]="KeyL",e[e.KeyM=12]="KeyM",e[e.KeyN=13]="KeyN",e[e.KeyO=14]="KeyO",e[e.KeyP=15]="KeyP",e[e.KeyQ=16]="KeyQ",e[e.KeyR=17]="KeyR",e[e.KeyS=18]="KeyS",e[e.KeyT=19]="KeyT",e[e.KeyU=20]="KeyU",e[e.KeyV=21]="KeyV",e[e.KeyW=22]="KeyW",e[e.KeyX=23]="KeyX",e[e.KeyY=24]="KeyY",e[e.KeyZ=25]="KeyZ",e[e.Digit0=26]="Digit0",e[e.Digit1=27]="Digit1",e[e.Digit2=28]="Digit2",e[e.Digit3=29]="Digit3",e[e.Digit4=30]="Digit4",e[e.Digit5=31]="Digit5",e[e.Digit6=32]="Digit6",e[e.Digit7=33]="Digit7",e[e.Digit8=34]="Digit8",e[e.Digit9=35]="Digit9",e[e.ArrowUp=36]="ArrowUp",e[e.ArrowDown=37]="ArrowDown",e[e.ArrowLeft=38]="ArrowLeft",e[e.ArrowRight=39]="ArrowRight",e[e.Space=40]="Space",e[e.Enter=41]="Enter",e[e.Escape=42]="Escape",e[e.Backspace=43]="Backspace",e[e.Tab=44]="Tab",e[e.ShiftLeft=45]="ShiftLeft",e[e.ShiftRight=46]="ShiftRight",e[e.ControlLeft=47]="ControlLeft",e[e.ControlRight=48]="ControlRight",e[e.AltLeft=49]="AltLeft",e[e.AltRight=50]="AltRight",e[e.MetaLeft=51]="MetaLeft",e[e.MetaRight=52]="MetaRight",e[e.CapsLock=53]="CapsLock",e[e.Delete=54]="Delete",e[e.Insert=55]="Insert",e[e.Home=56]="Home",e[e.End=57]="End",e[e.PageUp=58]="PageUp",e[e.PageDown=59]="PageDown",e[e.F1=60]="F1",e[e.F2=61]="F2",e[e.F3=62]="F3",e[e.F4=63]="F4",e[e.F5=64]="F5",e[e.F6=65]="F6",e[e.F7=66]="F7",e[e.F8=67]="F8",e[e.F9=68]="F9",e[e.F10=69]="F10",e[e.F11=70]="F11",e[e.F12=71]="F12",e[e.Minus=72]="Minus",e[e.Equal=73]="Equal",e[e.BracketLeft=74]="BracketLeft",e[e.BracketRight=75]="BracketRight",e[e.Backslash=76]="Backslash",e[e.Semicolon=77]="Semicolon",e[e.Quote=78]="Quote",e[e.Comma=79]="Comma",e[e.Period=80]="Period",e[e.Slash=81]="Slash",e[e.Backquote=82]="Backquote",e[e.Numpad0=91]="Numpad0",e[e.Numpad1=92]="Numpad1",e[e.Numpad2=93]="Numpad2",e[e.Numpad3=94]="Numpad3",e[e.Numpad4=95]="Numpad4",e[e.Numpad5=96]="Numpad5",e[e.Numpad6=97]="Numpad6",e[e.Numpad7=98]="Numpad7",e[e.Numpad8=99]="Numpad8",e[e.Numpad9=100]="Numpad9",e[e.NumpadAdd=101]="NumpadAdd",e[e.NumpadSubtract=102]="NumpadSubtract",e[e.NumpadMultiply=103]="NumpadMultiply",e[e.NumpadDivide=104]="NumpadDivide",e[e.NumpadDecimal=105]="NumpadDecimal",e[e.NumpadEnter=106]="NumpadEnter",e[e.NumLock=107]="NumLock",e[e.PrintScreen=111]="PrintScreen",e[e.ScrollLock=112]="ScrollLock",e[e.Pause=113]="Pause",e[e.ContextMenu=114]="ContextMenu",e))(M||{});var c=(e=>(e[e.LeftButton=0]="LeftButton",e[e.MiddleButton=1]="MiddleButton",e[e.RightButton=2]="RightButton",e[e.Button4=3]="Button4",e[e.Button5=4]="Button5",e[e.PositionX=100]="PositionX",e[e.PositionY=101]="PositionY",e[e.DeltaX=102]="DeltaX",e[e.DeltaY=103]="DeltaY",e[e.WheelDeltaY=104]="WheelDeltaY",e[e.WheelDeltaX=105]="WheelDeltaX",e))(c||{});var q=(e=>(e[e.ButtonA=0]="ButtonA",e[e.ButtonB=1]="ButtonB",e[e.ButtonX=2]="ButtonX",e[e.ButtonY=3]="ButtonY",e[e.LeftShoulder=4]="LeftShoulder",e[e.RightShoulder=5]="RightShoulder",e[e.LeftTrigger=6]="LeftTrigger",e[e.RightTrigger=7]="RightTrigger",e[e.Select=8]="Select",e[e.Start=9]="Start",e[e.LeftStick=10]="LeftStick",e[e.RightStick=11]="RightStick",e[e.DPadUp=12]="DPadUp",e[e.DPadDown=13]="DPadDown",e[e.DPadLeft=14]="DPadLeft",e[e.DPadRight=15]="DPadRight",e[e.Home=16]="Home",e[e.Touchpad=17]="Touchpad",e[e.LeftStickX=100]="LeftStickX",e[e.LeftStickY=101]="LeftStickY",e[e.RightStickX=102]="RightStickX",e[e.RightStickY=103]="RightStickY",e[e.LeftTriggerAxis=104]="LeftTriggerAxis",e[e.RightTriggerAxis=105]="RightTriggerAxis",e))(q||{});var O=(e=>(e[e.Touch0=0]="Touch0",e[e.Touch1=1]="Touch1",e[e.Touch2=2]="Touch2",e[e.Touch3=3]="Touch3",e[e.Touch4=4]="Touch4",e[e.Touch5=5]="Touch5",e[e.Touch6=6]="Touch6",e[e.Touch7=7]="Touch7",e[e.Touch8=8]="Touch8",e[e.Touch9=9]="Touch9",e[e.Touch0X=100]="Touch0X",e[e.Touch0Y=101]="Touch0Y",e[e.Touch1X=102]="Touch1X",e[e.Touch1Y=103]="Touch1Y",e[e.Touch2X=104]="Touch2X",e[e.Touch2Y=105]="Touch2Y",e[e.Touch3X=106]="Touch3X",e[e.Touch3Y=107]="Touch3Y",e[e.Touch4X=108]="Touch4X",e[e.Touch4Y=109]="Touch4Y",e[e.Touch5X=110]="Touch5X",e[e.Touch5Y=111]="Touch5Y",e[e.Touch6X=112]="Touch6X",e[e.Touch6Y=113]="Touch6Y",e[e.Touch7X=114]="Touch7X",e[e.Touch7Y=115]="Touch7Y",e[e.Touch8X=116]="Touch8X",e[e.Touch8Y=117]="Touch8Y",e[e.Touch9X=118]="Touch9X",e[e.Touch9Y=119]="Touch9Y",e[e.PinchScale=200]="PinchScale",e[e.RotationAngle=201]="RotationAngle",e[e.SwipeVelocityX=202]="SwipeVelocityX",e[e.SwipeVelocityY=203]="SwipeVelocityY",e))(O||{});var Q=(e=>(e[e.Zone0=0]="Zone0",e[e.Zone1=1]="Zone1",e[e.Zone2=2]="Zone2",e[e.Zone3=3]="Zone3",e[e.Zone4=4]="Zone4",e[e.Zone5=5]="Zone5",e[e.Zone6=6]="Zone6",e[e.Zone7=7]="Zone7",e[e.Zone8=8]="Zone8",e[e.Zone9=9]="Zone9",e[e.Zone10=10]="Zone10",e[e.Zone11=11]="Zone11",e[e.Zone12=12]="Zone12",e[e.Zone13=13]="Zone13",e[e.Zone14=14]="Zone14",e[e.Zone15=15]="Zone15",e[e.Zone16=16]="Zone16",e[e.Zone17=17]="Zone17",e[e.Zone18=18]="Zone18",e[e.Zone19=19]="Zone19",e[e.Zone20=20]="Zone20",e[e.Zone21=21]="Zone21",e[e.Zone22=22]="Zone22",e[e.Zone23=23]="Zone23",e[e.Zone24=24]="Zone24",e[e.Zone25=25]="Zone25",e[e.Zone26=26]="Zone26",e[e.Zone27=27]="Zone27",e[e.Zone28=28]="Zone28",e[e.Zone29=29]="Zone29",e[e.Zone30=30]="Zone30",e[e.Zone31=31]="Zone31",e[e.Zone0X=100]="Zone0X",e[e.Zone0Y=101]="Zone0Y",e[e.Zone1X=102]="Zone1X",e[e.Zone1Y=103]="Zone1Y",e[e.Zone2X=104]="Zone2X",e[e.Zone2Y=105]="Zone2Y",e[e.Zone3X=106]="Zone3X",e[e.Zone3Y=107]="Zone3Y",e[e.Zone4X=108]="Zone4X",e[e.Zone4Y=109]="Zone4Y",e[e.Zone5X=110]="Zone5X",e[e.Zone5Y=111]="Zone5Y",e[e.Zone6X=112]="Zone6X",e[e.Zone6Y=113]="Zone6Y",e[e.Zone7X=114]="Zone7X",e[e.Zone7Y=115]="Zone7Y",e[e.Zone8X=116]="Zone8X",e[e.Zone8Y=117]="Zone8Y",e[e.Zone9X=118]="Zone9X",e[e.Zone9Y=119]="Zone9Y",e[e.Zone10X=120]="Zone10X",e[e.Zone10Y=121]="Zone10Y",e[e.Zone11X=122]="Zone11X",e[e.Zone11Y=123]="Zone11Y",e[e.Zone12X=124]="Zone12X",e[e.Zone12Y=125]="Zone12Y",e[e.Zone13X=126]="Zone13X",e[e.Zone13Y=127]="Zone13Y",e[e.Zone14X=128]="Zone14X",e[e.Zone14Y=129]="Zone14Y",e[e.Zone15X=130]="Zone15X",e[e.Zone15Y=131]="Zone15Y",e[e.Zone16X=132]="Zone16X",e[e.Zone16Y=133]="Zone16Y",e[e.Zone17X=134]="Zone17X",e[e.Zone17Y=135]="Zone17Y",e[e.Zone18X=136]="Zone18X",e[e.Zone18Y=137]="Zone18Y",e[e.Zone19X=138]="Zone19X",e[e.Zone19Y=139]="Zone19Y",e[e.Zone20X=140]="Zone20X",e[e.Zone20Y=141]="Zone20Y",e[e.Zone21X=142]="Zone21X",e[e.Zone21Y=143]="Zone21Y",e[e.Zone22X=144]="Zone22X",e[e.Zone22Y=145]="Zone22Y",e[e.Zone23X=146]="Zone23X",e[e.Zone23Y=147]="Zone23Y",e[e.Zone24X=148]="Zone24X",e[e.Zone24Y=149]="Zone24Y",e[e.Zone25X=150]="Zone25X",e[e.Zone25Y=151]="Zone25Y",e[e.Zone26X=152]="Zone26X",e[e.Zone26Y=153]="Zone26Y",e[e.Zone27X=154]="Zone27X",e[e.Zone27Y=155]="Zone27Y",e[e.Zone28X=156]="Zone28X",e[e.Zone28Y=157]="Zone28Y",e[e.Zone29X=158]="Zone29X",e[e.Zone29Y=159]="Zone29Y",e[e.Zone30X=160]="Zone30X",e[e.Zone30Y=161]="Zone30Y",e[e.Zone31X=162]="Zone31X",e[e.Zone31Y=163]="Zone31Y",e))(Q||{});var $=(e=>(e[e.DPadUp=0]="DPadUp",e[e.DPadDown=1]="DPadDown",e[e.DPadLeft=2]="DPadLeft",e[e.DPadRight=3]="DPadRight",e[e.DPadCenter=4]="DPadCenter",e[e.Play=5]="Play",e[e.Pause=6]="Pause",e[e.PlayPause=7]="PlayPause",e[e.Stop=8]="Stop",e[e.Rewind=9]="Rewind",e[e.FastForward=10]="FastForward",e[e.Previous=11]="Previous",e[e.Next=12]="Next",e[e.Record=13]="Record",e[e.VolumeUp=15]="VolumeUp",e[e.VolumeDown=16]="VolumeDown",e[e.Mute=17]="Mute",e[e.ChannelUp=18]="ChannelUp",e[e.ChannelDown=19]="ChannelDown",e[e.Back=20]="Back",e[e.Home=21]="Home",e[e.Menu=22]="Menu",e[e.Info=23]="Info",e[e.Guide=24]="Guide",e[e.Exit=25]="Exit",e[e.Red=30]="Red",e[e.Green=31]="Green",e[e.Yellow=32]="Yellow",e[e.Blue=33]="Blue",e[e.Digit0=40]="Digit0",e[e.Digit1=41]="Digit1",e[e.Digit2=42]="Digit2",e[e.Digit3=43]="Digit3",e[e.Digit4=44]="Digit4",e[e.Digit5=45]="Digit5",e[e.Digit6=46]="Digit6",e[e.Digit7=47]="Digit7",e[e.Digit8=48]="Digit8",e[e.Digit9=49]="Digit9",e[e.Input=50]="Input",e[e.Settings=51]="Settings",e[e.Subtitle=52]="Subtitle",e[e.Audio=53]="Audio",e[e.Power=54]="Power",e[e.PointerX=100]="PointerX",e[e.PointerY=101]="PointerY",e[e.GyroX=102]="GyroX",e[e.GyroY=103]="GyroY",e[e.GyroZ=104]="GyroZ",e))($||{});var _=(e=>(e.TerminalGL="webgl",e.Terminal2D="terminal2d",e.TerminalANSI="ansi",e))(_||{}),ee=(e=>(e[e.None=0]="None",e[e.Eighth=1]="Eighth",e[e.Quarter=2]="Quarter",e[e.Half=3]="Half",e[e.Integer=4]="Integer",e[e.Responsive=5]="Responsive",e))(ee||{});var te=(e=>(e[e.Char=1]="Char",e[e.Text=2]="Text",e[e.SubFrame=3]="SubFrame",e[e.SubFrameMulti=4]="SubFrameMulti",e[e.FullFrame=5]="FullFrame",e[e.FullFrameMulti=6]="FullFrameMulti",e[e.Sprite=7]="Sprite",e[e.SpriteMulti=8]="SpriteMulti",e[e.ColorMap=9]="ColorMap",e[e.Shape=10]="Shape",e[e.DotCloud=11]="DotCloud",e[e.DotCloudMulti=12]="DotCloudMulti",e[e.SpriteCloud=13]="SpriteCloud",e[e.SpriteCloudMulti=14]="SpriteCloudMulti",e[e.SpriteCloudVaried=15]="SpriteCloudVaried",e[e.SpriteCloudVariedMulti=16]="SpriteCloudVariedMulti",e[e.Bitmask=17]="Bitmask",e[e.Bitmask4=18]="Bitmask4",e[e.Fill=19]="Fill",e[e.FillChar=20]="FillChar",e[e.FillSprite=21]="FillSprite",e[e.FillSpriteMulti=22]="FillSpriteMulti",e[e.TextMultiline=23]="TextMultiline",e[e.Bitmask16=24]="Bitmask16",e[e.Polyline=25]="Polyline",e[e.Audio=32]="Audio",e[e.Vibration=33]="Vibration",e[e.PostProcess=34]="PostProcess",e))(te||{}),se=(e=>(e[e.Rectangle=1]="Rectangle",e[e.Circle=2]="Circle",e[e.Line=3]="Line",e[e.Ellipse=4]="Ellipse",e[e.Triangle=5]="Triangle",e))(se||{}),ie=(e=>(e[e.FastPath=255]="FastPath",e[e.Fragment=254]="Fragment",e))(ie||{});var oe=(e=>(e[e.Enabled=1]="Enabled",e[e.SetMode=2]="SetMode",e[e.Position=4]="Position",e[e.ZOrder=8]="ZOrder",e[e.Orders=16]="Orders",e[e.IsMacroLayer=32]="IsMacroLayer",e[e.Is16BitMode=64]="Is16BitMode",e))(oe||{}),ne=(e=>(e.WAITING_FOR_WELCOME="waiting_for_welcome",e.AUTHENTICATING="authenticating",e.LOADING="loading",e.ACTIVE="active",e.DISCONNECTED="disconnected",e))(ne||{});var v=class{isActive=!1;targetElement;config;constructor(e=window,t={}){this.targetElement=e,this.config={enabled:!0,preventDefault:!1,stopPropagation:!1,debug:!1,...t}}isListening(){return this.isActive}destroy(){this.stop()}getTargetElement(){return this.targetElement}enable(){this.config.enabled=!0,this.isActive||this.start()}disable(){this.config.enabled=!1,this.isActive&&this.stop()}isEnabled(){return this.config.enabled??!0}},Y=class extends v{keys={};textInputsThisFrame=[];keyboardCallbacks={};boundHandlers;constructor(e=window,t={}){super(e,t),this.boundHandlers={keyDown:this.handleKeyDown.bind(this),keyUp:this.handleKeyUp.bind(this),blur:this.handleBlur.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.addEventListener("keyup",this.boundHandlers.keyUp),window.addEventListener("blur",this.boundHandlers.blur),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.removeEventListener("keyup",this.boundHandlers.keyUp),window.removeEventListener("blur",this.boundHandlers.blur),this.isActive=!1)}reset(){this.keys={},this.textInputsThisFrame=[]}resetDelta(){}poll(){for(let e in this.keys)this.keys[e].justPressed=!1,this.keys[e].justReleased=!1;this.textInputsThisFrame=[]}setCallbacks(e){this.keyboardCallbacks={...this.keyboardCallbacks,...e}}getTextInputs(){return this.textInputsThisFrame}isKeyPressed(e){return this.keys[e]?.pressed||!1}isKeyJustPressed(e){return this.keys[e]?.justPressed||!1}isKeyJustReleased(e){return this.keys[e]?.justReleased||!1}getKeysJustPressed(){let e=[];for(let t in this.keys)this.keys[t].justPressed&&e.push(t);return e}getKeysHeld(){let e=[];for(let t in this.keys)this.keys[t].pressed&&e.push(t);return e}shouldAllowDefault(e,t){let s=/^F([1-9]|1[0-2])$/.test(e),o=(t.ctrlKey||t.metaKey)&&(e==="KeyT"||e==="KeyW"||e==="KeyR"||e==="KeyN"||e==="Tab");return s||o}handleKeyDown(e){let t=e.code,s=this.shouldAllowDefault(t,e);this.config.preventDefault&&!s&&e.preventDefault(),this.config.stopPropagation&&!s&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed||(this.keys[t].justPressed=!0,this.keyboardCallbacks.onKeyDown?.(t,e)),this.keys[t].pressed=!0,this.keys[t].justReleased=!1;let o=e.key;o.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(o)}handleKeyUp(e){let t=e.code,s=this.shouldAllowDefault(t,e);this.config.preventDefault&&!s&&e.preventDefault(),this.config.stopPropagation&&!s&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed&&(this.keys[t].justReleased=!0,this.keyboardCallbacks.onKeyUp?.(t,e)),this.keys[t].pressed=!1,this.keys[t].justPressed=!1}handleBlur(){this.reset()}},X=class R extends v{mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}};mousePosition=new m(0,0);mouseDelta=new m(0,0);wheelDelta=0;boundHandlers;constructor(t=window,s={}){super(t,s),this.boundHandlers={mouseDown:this.handleMouseDown.bind(this),mouseUp:this.handleMouseUp.bind(this),mouseMove:this.handleMouseMove.bind(this),wheel:this.handleWheel.bind(this),contextMenu:this.handleContextMenu.bind(this),blur:this.handleBlur.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.addEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.addEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.addEventListener("wheel",this.boundHandlers.wheel),this.targetElement.addEventListener("contextmenu",this.boundHandlers.contextMenu),window.addEventListener("blur",this.boundHandlers.blur),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.removeEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.removeEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.removeEventListener("wheel",this.boundHandlers.wheel),this.targetElement.removeEventListener("contextmenu",this.boundHandlers.contextMenu),window.removeEventListener("blur",this.boundHandlers.blur),this.isActive=!1)}reset(){this.mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}},this.mousePosition=new m(0,0),this.mouseDelta=new m(0,0),this.wheelDelta=0}poll(){this.mouseButtons.left.justPressed=!1,this.mouseButtons.left.justReleased=!1,this.mouseButtons.middle.justPressed=!1,this.mouseButtons.middle.justReleased=!1,this.mouseButtons.right.justPressed=!1,this.mouseButtons.right.justReleased=!1,this.resetDelta()}resetDelta(){this.mouseDelta=new m(0,0),this.wheelDelta=0}isLeftMousePressed(){return this.mouseButtons.left.pressed}isLeftMouseJustPressed(){return this.mouseButtons.left.justPressed}isLeftMouseJustReleased(){return this.mouseButtons.left.justReleased}isRightMousePressed(){return this.mouseButtons.right.pressed}isRightMouseJustPressed(){return this.mouseButtons.right.justPressed}isRightMouseJustReleased(){return this.mouseButtons.right.justReleased}isMiddleMousePressed(){return this.mouseButtons.middle.pressed}getMousePosition(){return this.mousePosition.clone()}getMouseDelta(){return this.mouseDelta.clone()}getWheelDelta(){return this.wheelDelta}static BUTTON_NAMES=["left","middle","right"];handleMouseDown(t){this.config.preventDefault&&this.isInteractiveSurfaceEvent(t)&&t.preventDefault();let s=R.BUTTON_NAMES[t.button];if(s){let o=this.mouseButtons[s];o.pressed||(o.justPressed=!0),o.pressed=!0,o.justReleased=!1}}handleMouseUp(t){this.config.preventDefault&&this.isInteractiveSurfaceEvent(t)&&t.preventDefault();let s=R.BUTTON_NAMES[t.button];if(s){let o=this.mouseButtons[s];o.pressed&&(o.justReleased=!0),o.pressed=!1,o.justPressed=!1}}handleMouseMove(t){let s=new m(t.clientX,t.clientY);this.mouseDelta=s.subtract(this.mousePosition),this.mousePosition=s}handleWheel(t){this.config.preventDefault&&this.isInteractiveSurfaceEvent(t)&&t.preventDefault(),this.wheelDelta=t.deltaY}handleContextMenu(t){this.isInteractiveSurfaceEvent(t)&&t.preventDefault()}handleBlur(){this.reset()}isInteractiveSurfaceEvent(t){let s=t.target;return s?(s.tagName||"").toLowerCase()==="canvas"||(s.getAttribute?.("data-primitiv-input-surface")??"").toLowerCase()==="true"?!0:!!s.closest?.('canvas, [data-primitiv-input-surface="true"]'):!1}},I=class extends v{gamepads=new Map;previousGameState=new Map;rafId=null;boundHandlers;constructor(e=window,t={}){super(e,t),this.boundHandlers={connected:this.handleGamepadConnected.bind(this),disconnected:this.handleGamepadDisconnected.bind(this)}}start(){this.isActive||(window.addEventListener("gamepadconnected",this.boundHandlers.connected),window.addEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.startPolling(),this.isActive=!0)}stop(){this.isActive&&(window.removeEventListener("gamepadconnected",this.boundHandlers.connected),window.removeEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.stopPolling(),this.isActive=!1)}startPolling(){let e=()=>{this.poll(),this.rafId=requestAnimationFrame(e)};this.rafId=requestAnimationFrame(e)}stopPolling(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}poll(){let e=navigator.getGamepads();for(let t=0;t<e.length;t++){let s=e[t];s&&this.updateGamepadState(s)}}reset(){this.gamepads.clear(),this.previousGameState.clear()}resetDelta(){this.previousGameState.clear();for(let[e,t]of this.gamepads)this.previousGameState.set(e,this.cloneState(t))}updateGamepadState(e){let t=this.gamepads.get(e.index),s=e.buttons.map((o,a)=>{let i=t?.buttons[a],u=o.pressed,r=i?.pressed??!1;return{pressed:u,justPressed:u&&!r,justReleased:!u&&r,value:o.value,touched:o.touched}});this.gamepads.set(e.index,{id:e.id,index:e.index,connected:e.connected,buttons:s,axes:[...e.axes],timestamp:e.timestamp,mapping:e.mapping})}isButtonPressed(e,t){return this.gamepads.get(e)?.buttons[t]?.pressed??!1}isButtonJustPressed(e,t){return this.gamepads.get(e)?.buttons[t]?.justPressed??!1}isButtonJustReleased(e,t){return this.gamepads.get(e)?.buttons[t]?.justReleased??!1}getAxis(e,t){return this.gamepads.get(e)?.axes[t]??0}vibrationPresets={tap:{duration:50,strongMagnitude:.3,weakMagnitude:.5},impact:{duration:100,strongMagnitude:.7,weakMagnitude:.3},heavy:{duration:200,strongMagnitude:1,weakMagnitude:.2},success:{duration:150,strongMagnitude:.4,weakMagnitude:.6},error:{duration:300,strongMagnitude:.8,weakMagnitude:.4},explosion:{duration:400,strongMagnitude:1,weakMagnitude:.8}};async vibrate(e,t){let s=navigator.getGamepads()[e];if(!s||!s.vibrationActuator)return!1;try{return await s.vibrationActuator.playEffect("dual-rumble",{startDelay:t.startDelay??0,duration:t.duration,strongMagnitude:t.strongMagnitude??1,weakMagnitude:t.weakMagnitude??1}),!0}catch{return!1}}async vibratePreset(e,t){return this.vibrate(e,this.vibrationPresets[t])}async vibrateAll(e){let t=Array.from(this.gamepads.keys()).map(s=>this.vibrate(s,e));await Promise.all(t)}async stopVibration(e){let t=navigator.getGamepads()[e];if(t&&t.vibrationActuator)try{await t.vibrationActuator.reset()}catch{}}handleGamepadConnected(e){this.updateGamepadState(e.gamepad)}handleGamepadDisconnected(e){this.gamepads.delete(e.gamepad.index),this.previousGameState.delete(e.gamepad.index)}cloneState(e){return{...e,buttons:e.buttons.map(t=>({...t})),axes:[...e.axes]}}},K=class extends v{touches=new Map;nativeToInternal=new Map;maxTouches=10;boundHandlers;constructor(e=window,t={}){super(e,t),this.boundHandlers={touchStart:this.handleTouchStart.bind(this),touchEnd:this.handleTouchEnd.bind(this),touchMove:this.handleTouchMove.bind(this),touchCancel:this.handleTouchCancel.bind(this),visibilityChange:this.handleVisibilityChange.bind(this)}}start(){if(this.isActive)return;let e={passive:!this.config.preventDefault};this.targetElement.addEventListener("touchstart",this.boundHandlers.touchStart,e),this.targetElement.addEventListener("touchend",this.boundHandlers.touchEnd,e),this.targetElement.addEventListener("touchmove",this.boundHandlers.touchMove,e),this.targetElement.addEventListener("touchcancel",this.boundHandlers.touchCancel,e),document.addEventListener("visibilitychange",this.boundHandlers.visibilityChange),this.isActive=!0}stop(){this.isActive&&(this.targetElement.removeEventListener("touchstart",this.boundHandlers.touchStart),this.targetElement.removeEventListener("touchend",this.boundHandlers.touchEnd),this.targetElement.removeEventListener("touchmove",this.boundHandlers.touchMove),this.targetElement.removeEventListener("touchcancel",this.boundHandlers.touchCancel),document.removeEventListener("visibilitychange",this.boundHandlers.visibilityChange),this.isActive=!1)}poll(){let e=[];for(let[t,s]of this.touches)s.justReleased?e.push(t):(s.justPressed=!1,s.justReleased=!1);for(let t of e){let s=this.touches.get(t);s&&(this.nativeToInternal.delete(s.nativeId),this.touches.delete(t))}}reset(){this.touches.clear(),this.nativeToInternal.clear()}resetDelta(){}isTouchActive(e){return this.touches.get(e)?.active??!1}isTouchJustPressed(e){return this.touches.get(e)?.justPressed??!1}isTouchJustReleased(e){return this.touches.get(e)?.justReleased??!1}getTouchPosition(e){let t=this.touches.get(e);return t?{x:t.x,y:t.y}:null}getAllTouches(){return Array.from(this.touches.values()).filter(e=>e.active)}updateTouches(e){let t=new Set;for(let s=0;s<e.touches.length;s++){let o=e.touches[s],a=o.identifier;t.add(a);let i=this.nativeToInternal.get(a),u;if(i===void 0){if(this.touches.size>=this.maxTouches)continue;for(let d=0;d<this.maxTouches;d++)if(!this.touches.has(d)){i=d;break}if(i===void 0)continue;this.nativeToInternal.set(a,i),u=void 0}else u=this.touches.get(i);let r=!0,h=u?.active??!1;this.touches.set(i,{id:i,nativeId:a,active:r,justPressed:r&&!h,justReleased:!1,x:o.clientX,y:o.clientY,startX:u?.startX??o.clientX,startY:u?.startY??o.clientY})}for(let[s,o]of this.nativeToInternal)if(!t.has(s)){let a=this.touches.get(o);a&&a.active&&(a.active=!1,a.justReleased=!0)}}handleTouchStart(e){this.config.preventDefault&&e.preventDefault(),this.updateTouches(e)}handleTouchEnd(e){this.config.preventDefault&&e.preventDefault(),this.updateTouches(e)}handleTouchMove(e){this.config.preventDefault&&e.preventDefault(),this.updateTouches(e)}handleTouchCancel(e){this.handleTouchEnd(e)}handleVisibilityChange(){document.visibilityState==="hidden"&&this.reset()}},L=class extends v{constructor(e,t){super(t.targetElement,t),this.touch=e,this.gridWidth=t.gridWidth,this.gridHeight=t.gridHeight,t.zones&&this.setZones(t.zones)}zones=[];zoneStates=new Map;gridWidth;gridHeight;start(){this.isActive=!0}stop(){this.isActive=!1}reset(){this.zoneStates.clear()}resetDelta(){}setZones(e){this.zones=e;for(let t of e)this.zoneStates.has(t.id)||this.zoneStates.set(t.id,{pressed:!1,justPressed:!1,justReleased:!1,lastX:0,lastY:0})}updateFromTouches(){let e=this.targetElement.getBoundingClientRect(),t=e.width/this.gridWidth,s=e.height/this.gridHeight,o=this.touch.getAllTouches(),a=new Set;for(let i of o){let u=Math.floor((i.x-e.left)/t),r=Math.floor((i.y-e.top)/s);for(let h of this.zones)if(u>=h.x&&u<h.x+h.width&&r>=h.y&&r<h.y+h.height){a.add(h.id);let d=this.zoneStates.get(h.id);d.lastX=u,d.lastY=r}}for(let[i,u]of this.zoneStates){let r=a.has(i);r&&!u.pressed&&(u.justPressed=!0),!r&&u.pressed&&(u.justReleased=!0),u.pressed=r}}poll(){for(let e of this.zoneStates.values())e.justPressed=!1,e.justReleased=!1}isZonePressed(e){return this.zoneStates.get(e)?.pressed??!1}isZoneJustPressed(e){return this.zoneStates.get(e)?.justPressed??!1}isZoneJustReleased(e){return this.zoneStates.get(e)?.justReleased??!1}getZoneAxis(e,t){let s=this.zoneStates.get(e);if(!s||!s.pressed)return 0;let o=this.zones.find(a=>a.id===e);if(!o)return 0;if(t==="x"){let a=(o.width-1)/2,i=o.x+a;return a>0?(s.lastX-i)/a:0}else{let a=(o.height-1)/2,i=o.y+a;return a>0?(s.lastY-i)/a:0}}getZonePosition(e){let t=this.zoneStates.get(e);return t?{x:t.lastX,y:t.lastY}:null}},C=class extends v{accelerometer={x:0,y:0,z:0,includesGravity:!1};gyroscope={alpha:0,beta:0,gamma:0};orientation={alpha:null,beta:null,gamma:null,absolute:!1};prevAccelerometer={x:0,y:0,z:0,includesGravity:!1};prevGyroscope={alpha:0,beta:0,gamma:0};motionCallbacks={};motionConfig;permissionGranted=!1;boundHandlers;constructor(e=window,t={}){super(e,t),this.motionConfig={targetElement:e,includeGravity:t.includeGravity??!1,threshold:t.threshold??.1,autoRequestPermission:t.autoRequestPermission??!1,enabled:t.enabled??!0,debug:t.debug??!1,preventDefault:t.preventDefault??!1,stopPropagation:t.stopPropagation??!1},this.boundHandlers={devicemotion:this.handleDeviceMotion.bind(this),deviceorientation:this.handleDeviceOrientation.bind(this)}}async requestPermission(){if(typeof DeviceMotionEvent.requestPermission=="function")try{let e=await DeviceMotionEvent.requestPermission();return this.permissionGranted=e==="granted",this.permissionGranted}catch{return!1}return this.permissionGranted=!0,!0}start(){this.isActive||(window.addEventListener("devicemotion",this.boundHandlers.devicemotion),window.addEventListener("deviceorientation",this.boundHandlers.deviceorientation),this.isActive=!0)}stop(){this.isActive&&(window.removeEventListener("devicemotion",this.boundHandlers.devicemotion),window.removeEventListener("deviceorientation",this.boundHandlers.deviceorientation),this.isActive=!1)}setCallbacks(e){this.motionCallbacks={...this.motionCallbacks,...e}}poll(){}reset(){this.accelerometer={x:0,y:0,z:0,includesGravity:!1},this.gyroscope={alpha:0,beta:0,gamma:0},this.orientation={alpha:null,beta:null,gamma:null,absolute:!1}}resetDelta(){this.prevAccelerometer={...this.accelerometer},this.prevGyroscope={...this.gyroscope}}getAccelerometer(){return{...this.accelerometer}}getGyroscope(){return{...this.gyroscope}}getOrientation(){return{...this.orientation}}getNormalizedTilt(){return new m(Math.max(-1,Math.min(1,this.accelerometer.x/9.81)),Math.max(-1,Math.min(1,this.accelerometer.y/9.81)))}handleDeviceMotion(e){let t=this.motionConfig.includeGravity?e.accelerationIncludingGravity:e.acceleration;if(t){let o={x:t.x??0,y:t.y??0,z:t.z??0,includesGravity:this.motionConfig.includeGravity};this.hasSignificantChange(this.prevAccelerometer,o)&&(this.accelerometer=o,this.motionCallbacks.onAccelerometer?.(o))}let s=e.rotationRate;if(s){let o={alpha:s.alpha??0,beta:s.beta??0,gamma:s.gamma??0};this.hasSignificantGyroChange(this.prevGyroscope,o)&&(this.gyroscope=o,this.motionCallbacks.onGyroscope?.(o))}}handleDeviceOrientation(e){this.orientation={alpha:e.alpha,beta:e.beta,gamma:e.gamma,absolute:e.absolute},this.motionCallbacks.onOrientation?.(this.orientation)}hasSignificantChange(e,t){let s=this.motionConfig.threshold;return Math.abs(t.x-e.x)>s||Math.abs(t.y-e.y)>s||Math.abs(t.z-e.z)>s}hasSignificantGyroChange(e,t){let s=this.motionConfig.threshold;return Math.abs(t.alpha-e.alpha)>s||Math.abs(t.beta-e.beta)>s||Math.abs(t.gamma-e.gamma)>s}},ae=class{keyboard=null;mouse=null;gamepad=null;touch=null;touchZone=null;motion=null;config;constructor(e={}){this.config={enableKeyboardMouse:e.enableKeyboardMouse??!0,enableGamepad:e.enableGamepad??!0,enableTouch:e.enableTouch??!0,targetElement:e.targetElement??window,gridWidth:e.gridWidth??80,gridHeight:e.gridHeight??25,debug:e.debug??!1},this.initialize()}initialize(){let e=this.config.targetElement;if(this.config.enableKeyboardMouse&&(this.keyboard=new Y(e),this.mouse=new X(e)),this.config.enableGamepad&&(this.gamepad=new I(e)),this.config.enableTouch){this.touch=new K(e);let t=e instanceof Window?document.body:e;this.touchZone=new L(this.touch,{targetElement:t,gridWidth:this.config.gridWidth,gridHeight:this.config.gridHeight}),this.motion=new C(e)}this.start()}getButton(e,t){switch(e){case n.Keyboard:return this.keyboard?.isKeyPressed(M[t])??!1;case n.Mouse:return this.getMouseButton(t);case n.Gamepad:return this.gamepad?.isButtonPressed(0,t)??!1;case n.Touch:return this.touch?.isTouchActive(t)??!1;case n.TouchZone:return this.touchZone?.isZonePressed(t)??!1;default:return!1}}getButtonJustPressed(e,t){switch(e){case n.Keyboard:return this.keyboard?.isKeyJustPressed(M[t])??!1;case n.Mouse:return this.getMouseButtonJustPressed(t);case n.Gamepad:return this.gamepad?.isButtonJustPressed(0,t)??!1;case n.Touch:return this.touch?.isTouchJustPressed?.(t)??!1;case n.TouchZone:return this.touchZone?.isZoneJustPressed(t)??!1;default:return!1}}getButtonJustReleased(e,t){switch(e){case n.Keyboard:return this.keyboard?.isKeyJustReleased(M[t])??!1;case n.Mouse:return this.getMouseButtonJustReleased(t);case n.Gamepad:return this.gamepad?.isButtonJustReleased(0,t)??!1;case n.Touch:return this.touch?.isTouchJustReleased?.(t)??!1;case n.TouchZone:return this.touchZone?.isZoneJustReleased(t)??!1;default:return!1}}getAxis(e,t){switch(e){case n.Mouse:return this.getMouseAxis(t);case n.Gamepad:return this.gamepad?.getAxis(0,t-100)??0;case n.Touch:return this.getTouchAxis(t);case n.TouchZone:return this.getTouchZoneAxis(t);default:return 0}}isLeftMousePressed(){return this.mouse?.isLeftMousePressed()??!1}getTextInputs(){return this.keyboard?.getTextInputs()??[]}getMouseButton(e){return this.mouse?e===c.LeftButton?this.mouse.isLeftMousePressed():e===c.RightButton?this.mouse.isRightMousePressed():e===c.MiddleButton?this.mouse.isMiddleMousePressed():!1:!1}getMouseButtonJustPressed(e){return this.mouse?e===c.LeftButton?this.mouse.isLeftMouseJustPressed():e===c.RightButton?this.mouse.isRightMouseJustPressed():!1:!1}getMouseButtonJustReleased(e){return this.mouse?e===c.LeftButton?this.mouse.isLeftMouseJustReleased():e===c.RightButton?this.mouse.isRightMouseJustReleased():!1:!1}getMouseAxis(e){return this.mouse?e===c.PositionX?this.mouse.getMousePosition().x:e===c.PositionY?this.mouse.getMousePosition().y:e===c.DeltaX?this.mouse.getMouseDelta().x:e===c.DeltaY?this.mouse.getMouseDelta().y:e===c.WheelDeltaY?this.mouse.getWheelDelta():0:0}getTouchAxis(e){if(!this.touch)return 0;if(e>=100&&e<200){let t=Math.floor((e-100)/2),s=(e-100)%2===1,o=this.touch.getTouchPosition(t);return o?s?o.y:o.x:0}return 0}getTouchZoneAxis(e){if(!this.touchZone)return 0;if(e>=100&&e<200){let t=Math.floor((e-100)/2),s=(e-100)%2===1;return this.touchZone.getZoneAxis(t,s?"y":"x")}return 0}getMouseGridX(){if(!this.mouse)return 0;let e=this.mouse.getMousePosition().x,t=this.config.targetElement,s,o;if(t instanceof Window)s=t.innerWidth,o=0;else{let a=t.getBoundingClientRect();s=a.width,o=a.left}return s===0?0:Math.floor((e-o)/s*this.config.gridWidth)}getMouseGridY(){if(!this.mouse)return 0;let e=this.mouse.getMousePosition().y,t=this.config.targetElement,s,o;if(t instanceof Window)s=t.innerHeight,o=0;else{let a=t.getBoundingClientRect();s=a.height,o=a.top}return s===0?0:Math.floor((e-o)/s*this.config.gridHeight)}isMouseButtonDown(e){return this.mouse?e===0?this.mouse.isLeftMousePressed():e===1?this.mouse.isMiddleMousePressed():e===2?this.mouse.isRightMousePressed():!1:!1}getKeysPressed(){return this.keyboard?.getKeysJustPressed()??[]}getKeysHeld(){return this.keyboard?.getKeysHeld()??[]}start(){this.keyboard?.start(),this.mouse?.start(),this.gamepad?.start(),this.touch?.start(),this.touchZone?.start(),this.motion?.start()}stop(){this.keyboard?.stop(),this.mouse?.stop(),this.gamepad?.stop(),this.touch?.stop(),this.touchZone?.stop(),this.motion?.stop()}reset(){this.keyboard?.reset(),this.mouse?.reset(),this.gamepad?.reset(),this.touch?.reset(),this.touchZone?.reset(),this.motion?.reset()}poll(){this.keyboard?.poll(),this.mouse?.poll(),this.gamepad?.poll(),this.touch?.poll(),this.touchZone?.updateFromTouches(),this.touchZone?.poll(),this.motion?.poll()}resetDelta(){this.keyboard?.resetDelta(),this.mouse?.resetDelta(),this.gamepad?.resetDelta(),this.touch?.resetDelta(),this.touchZone?.resetDelta(),this.motion?.resetDelta()}destroy(){this.stop(),this.keyboard?.destroy(),this.mouse?.destroy(),this.gamepad?.destroy(),this.touch?.destroy(),this.touchZone?.destroy(),this.motion?.destroy()}},ue=class k{static calculateRenderMetrics(t,s){let o=t.getBoundingClientRect(),a=t.width/t.height,i=o.width/o.height,u,r,h,d;a>i?(u=o.width,r=o.width/a,h=0,d=(o.height-r)/2):(u=o.height*a,r=o.height,h=(o.width-u)/2,d=0);let y=s?.offsetX||0,f=s?.offsetY||0;return h+=y,d+=f,u-=y*2,r-=f*2,{renderWidth:u,renderHeight:r,offsetX:h,offsetY:d,rect:o}}static collectAxisSources(t,s){let o=new Map;for(let a of t)for(let i of a.sources){if(o.has(i.sourceId))continue;let u=0,r=!1;if(i.type===n.Keyboard&&i.negativeKey!==void 0&&i.positiveKey!==void 0){let h=s.getButton(n.Keyboard,i.negativeKey);s.getButton(n.Keyboard,i.positiveKey)&&(u+=1),h&&(u-=1),r=!0}else if(i.type===n.Mouse&&i.mouseAxis!==void 0)u=s.getAxis(n.Mouse,i.mouseAxis),r=!0;else if(i.type===n.Gamepad&&i.axis!==void 0)u=s.getAxis(n.Gamepad,i.axis),r=!0;else if(i.type===n.Touch&&i.touchId!==void 0&&i.touchAxis!==void 0){let h=100+i.touchId*2,d=i.touchAxis==="x"?h:h+1;u=s.getAxis(n.Touch,d),r=!0}else if(i.type===n.TouchZone&&i.touchZoneId!==void 0&&i.touchZoneAxis!==void 0){let h=100+i.touchZoneId*2,d=i.touchZoneAxis==="x"?h:h+1;u=s.getAxis(n.TouchZone,d),r=!0}r&&o.set(i.sourceId,u)}return o}static collectButtonSources(t,s){let o=new Map;for(let a of t)for(let i of a.sources){if(o.has(i.sourceId))continue;let u=!1,r=!1;i.type===n.Keyboard&&i.key!==void 0?(u=s.getButton(n.Keyboard,i.key),r=!0):i.type===n.Mouse&&i.mouseButton!==void 0?(u=s.getButton(n.Mouse,i.mouseButton),r=!0):i.type===n.Gamepad&&i.button!==void 0?(u=s.getButton(n.Gamepad,i.button),r=!0):i.type===n.Touch&&i.touchButton!==void 0?(u=s.getButton(n.Touch,i.touchButton),r=!0):i.type===n.TouchZone&&i.touchZoneId!==void 0&&(u=s.getButton(n.TouchZone,i.touchZoneId),r=!0),r&&o.set(i.sourceId,u)}return o}static collectButtonSourcesWithTransitions(t,s){let o=new Map;for(let a of t)for(let i of a.sources){if(o.has(i.sourceId))continue;let u=!1,r=!1,h=!1,d=!1;i.type===n.Keyboard&&i.key!==void 0?(u=s.getButton(n.Keyboard,i.key),r=s.getButtonJustPressed(n.Keyboard,i.key),h=s.getButtonJustReleased(n.Keyboard,i.key),d=!0):i.type===n.Mouse&&i.mouseButton!==void 0?(u=s.getButton(n.Mouse,i.mouseButton),r=s.getButtonJustPressed(n.Mouse,i.mouseButton),h=s.getButtonJustReleased(n.Mouse,i.mouseButton),d=!0):i.type===n.Gamepad&&i.button!==void 0?(u=s.getButton(n.Gamepad,i.button),r=s.getButtonJustPressed(n.Gamepad,i.button),h=s.getButtonJustReleased(n.Gamepad,i.button),d=!0):i.type===n.Touch&&i.touchButton!==void 0?(u=s.getButton(n.Touch,i.touchButton),r=s.getButtonJustPressed(n.Touch,i.touchButton),h=s.getButtonJustReleased(n.Touch,i.touchButton),d=!0):i.type===n.TouchZone&&i.touchZoneId!==void 0&&(u=s.getButton(n.TouchZone,i.touchZoneId),r=s.getButtonJustPressed(n.TouchZone,i.touchZoneId),h=s.getButtonJustReleased(n.TouchZone,i.touchZoneId),d=!0),d&&o.set(i.sourceId,{pressed:u,justPressed:r,justReleased:h})}return o}static collectMousePosition(t,s,o,a,i){let u=t.getAxis(n.Mouse,100),r=t.getAxis(n.Mouse,101),h=t.getButton(n.Mouse,0),{renderWidth:d,renderHeight:y,offsetX:f,offsetY:T,rect:w}=k.calculateRenderMetrics(s,i),b=u-w.left-f,p=r-w.top-T,x=d/o,P=y/a,D=Math.floor(b/x),B=Math.floor(p/P),Z=b>=0&&b<d&&p>=0&&p<y;return{x:Math.max(0,Math.min(o-1,D)),y:Math.max(0,Math.min(a-1,B)),over:Z,isLeftDown:h}}static collectTouchPositions(t,s,o,a,i=10,u){let r=[],{renderWidth:h,renderHeight:d,offsetX:y,offsetY:f,rect:T}=k.calculateRenderMetrics(s,u),w=h/o,b=d/a;for(let p=0;p<i;p++)if(t.getButton(n.Touch,p)){let x=100+p*2,P=100+p*2+1,D=t.getAxis(n.Touch,x),B=t.getAxis(n.Touch,P),Z=D-T.left-y,S=B-T.top-f,H=Math.floor(Z/w),G=Math.floor(S/b),F=Z>=0&&Z<h&&S>=0&&S<d;r.push({id:p,x:Math.max(0,Math.min(o-1,H)),y:Math.max(0,Math.min(a-1,G)),over:F})}return r}static collectTextInputs(t){return typeof t.getTextInputs=="function"?t.getTextInputs():[]}},g={tap:10,mediumTap:25,heavyTap:50,success:[30,50,30],error:[50,30,50,30,50],warning:[100],selection:5,impactLight:15,impactMedium:30,impactHeavy:50,notification:[100,100,100,100,100],sos:[100,30,100,30,100,30,200,30,200,30,200,30,100,30,100,30,100]},z=class{enabled;intensity;supported;userActivated=!1;constructor(e={}){this.enabled=e.enabled??!0,this.intensity=Math.max(0,Math.min(1,e.intensity??1)),this.supported=typeof navigator<"u"&&typeof navigator.vibrate=="function"}isSupported(){return this.supported}isEnabled(){return this.enabled&&this.supported}setEnabled(e){this.enabled=e}setIntensity(e){this.intensity=Math.max(0,Math.min(1,e))}getIntensity(){return this.intensity}hasUserActivation(){return this.userActivated}vibrate(e){if(!this.isEnabled())return!1;let t=this.scalePattern(e),s=navigator.vibrate(t);return s&&(this.userActivated=!0),s}cancel(){this.supported&&navigator.vibrate(0)}tap(){return this.vibrate(g.tap)}mediumTap(){return this.vibrate(g.mediumTap)}heavyTap(){return this.vibrate(g.heavyTap)}success(){return this.vibrate(g.success)}error(){return this.vibrate(g.error)}warning(){return this.vibrate(g.warning)}selection(){return this.vibrate(g.selection)}impactLight(){return this.vibrate(g.impactLight)}impactMedium(){return this.vibrate(g.impactMedium)}impactHeavy(){return this.vibrate(g.impactHeavy)}notification(){return this.vibrate(g.notification)}scalePattern(e){return this.intensity===1?e:typeof e=="number"?Math.round(e*this.intensity):e.map((t,s)=>s%2===0?Math.round(t*this.intensity):t)}},E=null;function re(e){return E||(E=new z(e)),E}
|
package/dist/input.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '@primitiv/input';
|
package/dist/input.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var m=class l{x;y;constructor(t=0,s=0){this.x=t,this.y=s}static zero(){return new l(0,0)}static one(){return new l(1,1)}static up(){return new l(0,-1)}static down(){return new l(0,1)}static left(){return new l(-1,0)}static right(){return new l(1,0)}add(t){return new l(this.x+t.x,this.y+t.y)}subtract(t){return new l(this.x-t.x,this.y-t.y)}multiply(t){return new l(this.x*t,this.y*t)}divide(t){if(t===0)throw new Error("Division by zero");return new l(this.x/t,this.y/t)}length(){return Math.sqrt(this.x*this.x+this.y*this.y)}lengthSquared(){return this.x*this.x+this.y*this.y}normalize(){let t=this.length();return t===0?l.zero():this.divide(t)}distance(t){return this.subtract(t).length()}distanceSquared(t){return this.subtract(t).lengthSquared()}dot(t){return this.x*t.x+this.y*t.y}cross(t){return this.x*t.y-this.y*t.x}angle(){return Math.atan2(this.y,this.x)}angleTo(t){return Math.atan2(t.y-this.y,t.x-this.x)}rotate(t){let s=Math.cos(t),o=Math.sin(t);return new l(this.x*s-this.y*o,this.x*o+this.y*s)}lerp(t,s){return new l(this.x+(t.x-this.x)*s,this.y+(t.y-this.y)*s)}clone(){return new l(this.x,this.y)}equals(t){return this.x===t.x&&this.y===t.y}toString(){return`Vector2(${this.x}, ${this.y})`}toArray(){return[this.x,this.y]}set(t,s){return this.x=t,this.y=s,this}copy(t){return this.x=t.x,this.y=t.y,this}addInPlace(t){return this.x+=t.x,this.y+=t.y,this}subtractInPlace(t){return this.x-=t.x,this.y-=t.y,this}multiplyInPlace(t){return this.x*=t,this.y*=t,this}divideInPlace(t){if(t===0)throw new Error("Division by zero");return this.x/=t,this.y/=t,this}normalizeInPlace(){let t=this.length();return t===0?(this.x=0,this.y=0):(this.x/=t,this.y/=t),this}};var n=(e=>(e[e.Keyboard=0]="Keyboard",e[e.Mouse=1]="Mouse",e[e.Gamepad=2]="Gamepad",e[e.Touch=3]="Touch",e[e.TVRemote=4]="TVRemote",e[e.TextInput=5]="TextInput",e[e.Motion=6]="Motion",e[e.TouchZone=7]="TouchZone",e))(n||{}),M=(e=>(e[e.KeyA=0]="KeyA",e[e.KeyB=1]="KeyB",e[e.KeyC=2]="KeyC",e[e.KeyD=3]="KeyD",e[e.KeyE=4]="KeyE",e[e.KeyF=5]="KeyF",e[e.KeyG=6]="KeyG",e[e.KeyH=7]="KeyH",e[e.KeyI=8]="KeyI",e[e.KeyJ=9]="KeyJ",e[e.KeyK=10]="KeyK",e[e.KeyL=11]="KeyL",e[e.KeyM=12]="KeyM",e[e.KeyN=13]="KeyN",e[e.KeyO=14]="KeyO",e[e.KeyP=15]="KeyP",e[e.KeyQ=16]="KeyQ",e[e.KeyR=17]="KeyR",e[e.KeyS=18]="KeyS",e[e.KeyT=19]="KeyT",e[e.KeyU=20]="KeyU",e[e.KeyV=21]="KeyV",e[e.KeyW=22]="KeyW",e[e.KeyX=23]="KeyX",e[e.KeyY=24]="KeyY",e[e.KeyZ=25]="KeyZ",e[e.Digit0=26]="Digit0",e[e.Digit1=27]="Digit1",e[e.Digit2=28]="Digit2",e[e.Digit3=29]="Digit3",e[e.Digit4=30]="Digit4",e[e.Digit5=31]="Digit5",e[e.Digit6=32]="Digit6",e[e.Digit7=33]="Digit7",e[e.Digit8=34]="Digit8",e[e.Digit9=35]="Digit9",e[e.ArrowUp=36]="ArrowUp",e[e.ArrowDown=37]="ArrowDown",e[e.ArrowLeft=38]="ArrowLeft",e[e.ArrowRight=39]="ArrowRight",e[e.Space=40]="Space",e[e.Enter=41]="Enter",e[e.Escape=42]="Escape",e[e.Backspace=43]="Backspace",e[e.Tab=44]="Tab",e[e.ShiftLeft=45]="ShiftLeft",e[e.ShiftRight=46]="ShiftRight",e[e.ControlLeft=47]="ControlLeft",e[e.ControlRight=48]="ControlRight",e[e.AltLeft=49]="AltLeft",e[e.AltRight=50]="AltRight",e[e.MetaLeft=51]="MetaLeft",e[e.MetaRight=52]="MetaRight",e[e.CapsLock=53]="CapsLock",e[e.Delete=54]="Delete",e[e.Insert=55]="Insert",e[e.Home=56]="Home",e[e.End=57]="End",e[e.PageUp=58]="PageUp",e[e.PageDown=59]="PageDown",e[e.F1=60]="F1",e[e.F2=61]="F2",e[e.F3=62]="F3",e[e.F4=63]="F4",e[e.F5=64]="F5",e[e.F6=65]="F6",e[e.F7=66]="F7",e[e.F8=67]="F8",e[e.F9=68]="F9",e[e.F10=69]="F10",e[e.F11=70]="F11",e[e.F12=71]="F12",e[e.Minus=72]="Minus",e[e.Equal=73]="Equal",e[e.BracketLeft=74]="BracketLeft",e[e.BracketRight=75]="BracketRight",e[e.Backslash=76]="Backslash",e[e.Semicolon=77]="Semicolon",e[e.Quote=78]="Quote",e[e.Comma=79]="Comma",e[e.Period=80]="Period",e[e.Slash=81]="Slash",e[e.Backquote=82]="Backquote",e[e.Numpad0=91]="Numpad0",e[e.Numpad1=92]="Numpad1",e[e.Numpad2=93]="Numpad2",e[e.Numpad3=94]="Numpad3",e[e.Numpad4=95]="Numpad4",e[e.Numpad5=96]="Numpad5",e[e.Numpad6=97]="Numpad6",e[e.Numpad7=98]="Numpad7",e[e.Numpad8=99]="Numpad8",e[e.Numpad9=100]="Numpad9",e[e.NumpadAdd=101]="NumpadAdd",e[e.NumpadSubtract=102]="NumpadSubtract",e[e.NumpadMultiply=103]="NumpadMultiply",e[e.NumpadDivide=104]="NumpadDivide",e[e.NumpadDecimal=105]="NumpadDecimal",e[e.NumpadEnter=106]="NumpadEnter",e[e.NumLock=107]="NumLock",e[e.PrintScreen=111]="PrintScreen",e[e.ScrollLock=112]="ScrollLock",e[e.Pause=113]="Pause",e[e.ContextMenu=114]="ContextMenu",e))(M||{});var c=(e=>(e[e.LeftButton=0]="LeftButton",e[e.MiddleButton=1]="MiddleButton",e[e.RightButton=2]="RightButton",e[e.Button4=3]="Button4",e[e.Button5=4]="Button5",e[e.PositionX=100]="PositionX",e[e.PositionY=101]="PositionY",e[e.DeltaX=102]="DeltaX",e[e.DeltaY=103]="DeltaY",e[e.WheelDeltaY=104]="WheelDeltaY",e[e.WheelDeltaX=105]="WheelDeltaX",e))(c||{});var I=(e=>(e[e.ButtonA=0]="ButtonA",e[e.ButtonB=1]="ButtonB",e[e.ButtonX=2]="ButtonX",e[e.ButtonY=3]="ButtonY",e[e.LeftShoulder=4]="LeftShoulder",e[e.RightShoulder=5]="RightShoulder",e[e.LeftTrigger=6]="LeftTrigger",e[e.RightTrigger=7]="RightTrigger",e[e.Select=8]="Select",e[e.Start=9]="Start",e[e.LeftStick=10]="LeftStick",e[e.RightStick=11]="RightStick",e[e.DPadUp=12]="DPadUp",e[e.DPadDown=13]="DPadDown",e[e.DPadLeft=14]="DPadLeft",e[e.DPadRight=15]="DPadRight",e[e.Home=16]="Home",e[e.Touchpad=17]="Touchpad",e[e.LeftStickX=100]="LeftStickX",e[e.LeftStickY=101]="LeftStickY",e[e.RightStickX=102]="RightStickX",e[e.RightStickY=103]="RightStickY",e[e.LeftTriggerAxis=104]="LeftTriggerAxis",e[e.RightTriggerAxis=105]="RightTriggerAxis",e))(I||{});var K=(e=>(e[e.Touch0=0]="Touch0",e[e.Touch1=1]="Touch1",e[e.Touch2=2]="Touch2",e[e.Touch3=3]="Touch3",e[e.Touch4=4]="Touch4",e[e.Touch5=5]="Touch5",e[e.Touch6=6]="Touch6",e[e.Touch7=7]="Touch7",e[e.Touch8=8]="Touch8",e[e.Touch9=9]="Touch9",e[e.Touch0X=100]="Touch0X",e[e.Touch0Y=101]="Touch0Y",e[e.Touch1X=102]="Touch1X",e[e.Touch1Y=103]="Touch1Y",e[e.Touch2X=104]="Touch2X",e[e.Touch2Y=105]="Touch2Y",e[e.Touch3X=106]="Touch3X",e[e.Touch3Y=107]="Touch3Y",e[e.Touch4X=108]="Touch4X",e[e.Touch4Y=109]="Touch4Y",e[e.Touch5X=110]="Touch5X",e[e.Touch5Y=111]="Touch5Y",e[e.Touch6X=112]="Touch6X",e[e.Touch6Y=113]="Touch6Y",e[e.Touch7X=114]="Touch7X",e[e.Touch7Y=115]="Touch7Y",e[e.Touch8X=116]="Touch8X",e[e.Touch8Y=117]="Touch8Y",e[e.Touch9X=118]="Touch9X",e[e.Touch9Y=119]="Touch9Y",e[e.PinchScale=200]="PinchScale",e[e.RotationAngle=201]="RotationAngle",e[e.SwipeVelocityX=202]="SwipeVelocityX",e[e.SwipeVelocityY=203]="SwipeVelocityY",e))(K||{});var L=(e=>(e[e.Zone0=0]="Zone0",e[e.Zone1=1]="Zone1",e[e.Zone2=2]="Zone2",e[e.Zone3=3]="Zone3",e[e.Zone4=4]="Zone4",e[e.Zone5=5]="Zone5",e[e.Zone6=6]="Zone6",e[e.Zone7=7]="Zone7",e[e.Zone8=8]="Zone8",e[e.Zone9=9]="Zone9",e[e.Zone10=10]="Zone10",e[e.Zone11=11]="Zone11",e[e.Zone12=12]="Zone12",e[e.Zone13=13]="Zone13",e[e.Zone14=14]="Zone14",e[e.Zone15=15]="Zone15",e[e.Zone16=16]="Zone16",e[e.Zone17=17]="Zone17",e[e.Zone18=18]="Zone18",e[e.Zone19=19]="Zone19",e[e.Zone20=20]="Zone20",e[e.Zone21=21]="Zone21",e[e.Zone22=22]="Zone22",e[e.Zone23=23]="Zone23",e[e.Zone24=24]="Zone24",e[e.Zone25=25]="Zone25",e[e.Zone26=26]="Zone26",e[e.Zone27=27]="Zone27",e[e.Zone28=28]="Zone28",e[e.Zone29=29]="Zone29",e[e.Zone30=30]="Zone30",e[e.Zone31=31]="Zone31",e[e.Zone0X=100]="Zone0X",e[e.Zone0Y=101]="Zone0Y",e[e.Zone1X=102]="Zone1X",e[e.Zone1Y=103]="Zone1Y",e[e.Zone2X=104]="Zone2X",e[e.Zone2Y=105]="Zone2Y",e[e.Zone3X=106]="Zone3X",e[e.Zone3Y=107]="Zone3Y",e[e.Zone4X=108]="Zone4X",e[e.Zone4Y=109]="Zone4Y",e[e.Zone5X=110]="Zone5X",e[e.Zone5Y=111]="Zone5Y",e[e.Zone6X=112]="Zone6X",e[e.Zone6Y=113]="Zone6Y",e[e.Zone7X=114]="Zone7X",e[e.Zone7Y=115]="Zone7Y",e[e.Zone8X=116]="Zone8X",e[e.Zone8Y=117]="Zone8Y",e[e.Zone9X=118]="Zone9X",e[e.Zone9Y=119]="Zone9Y",e[e.Zone10X=120]="Zone10X",e[e.Zone10Y=121]="Zone10Y",e[e.Zone11X=122]="Zone11X",e[e.Zone11Y=123]="Zone11Y",e[e.Zone12X=124]="Zone12X",e[e.Zone12Y=125]="Zone12Y",e[e.Zone13X=126]="Zone13X",e[e.Zone13Y=127]="Zone13Y",e[e.Zone14X=128]="Zone14X",e[e.Zone14Y=129]="Zone14Y",e[e.Zone15X=130]="Zone15X",e[e.Zone15Y=131]="Zone15Y",e[e.Zone16X=132]="Zone16X",e[e.Zone16Y=133]="Zone16Y",e[e.Zone17X=134]="Zone17X",e[e.Zone17Y=135]="Zone17Y",e[e.Zone18X=136]="Zone18X",e[e.Zone18Y=137]="Zone18Y",e[e.Zone19X=138]="Zone19X",e[e.Zone19Y=139]="Zone19Y",e[e.Zone20X=140]="Zone20X",e[e.Zone20Y=141]="Zone20Y",e[e.Zone21X=142]="Zone21X",e[e.Zone21Y=143]="Zone21Y",e[e.Zone22X=144]="Zone22X",e[e.Zone22Y=145]="Zone22Y",e[e.Zone23X=146]="Zone23X",e[e.Zone23Y=147]="Zone23Y",e[e.Zone24X=148]="Zone24X",e[e.Zone24Y=149]="Zone24Y",e[e.Zone25X=150]="Zone25X",e[e.Zone25Y=151]="Zone25Y",e[e.Zone26X=152]="Zone26X",e[e.Zone26Y=153]="Zone26Y",e[e.Zone27X=154]="Zone27X",e[e.Zone27Y=155]="Zone27Y",e[e.Zone28X=156]="Zone28X",e[e.Zone28Y=157]="Zone28Y",e[e.Zone29X=158]="Zone29X",e[e.Zone29Y=159]="Zone29Y",e[e.Zone30X=160]="Zone30X",e[e.Zone30Y=161]="Zone30Y",e[e.Zone31X=162]="Zone31X",e[e.Zone31Y=163]="Zone31Y",e))(L||{});var C=(e=>(e[e.DPadUp=0]="DPadUp",e[e.DPadDown=1]="DPadDown",e[e.DPadLeft=2]="DPadLeft",e[e.DPadRight=3]="DPadRight",e[e.DPadCenter=4]="DPadCenter",e[e.Play=5]="Play",e[e.Pause=6]="Pause",e[e.PlayPause=7]="PlayPause",e[e.Stop=8]="Stop",e[e.Rewind=9]="Rewind",e[e.FastForward=10]="FastForward",e[e.Previous=11]="Previous",e[e.Next=12]="Next",e[e.Record=13]="Record",e[e.VolumeUp=15]="VolumeUp",e[e.VolumeDown=16]="VolumeDown",e[e.Mute=17]="Mute",e[e.ChannelUp=18]="ChannelUp",e[e.ChannelDown=19]="ChannelDown",e[e.Back=20]="Back",e[e.Home=21]="Home",e[e.Menu=22]="Menu",e[e.Info=23]="Info",e[e.Guide=24]="Guide",e[e.Exit=25]="Exit",e[e.Red=30]="Red",e[e.Green=31]="Green",e[e.Yellow=32]="Yellow",e[e.Blue=33]="Blue",e[e.Digit0=40]="Digit0",e[e.Digit1=41]="Digit1",e[e.Digit2=42]="Digit2",e[e.Digit3=43]="Digit3",e[e.Digit4=44]="Digit4",e[e.Digit5=45]="Digit5",e[e.Digit6=46]="Digit6",e[e.Digit7=47]="Digit7",e[e.Digit8=48]="Digit8",e[e.Digit9=49]="Digit9",e[e.Input=50]="Input",e[e.Settings=51]="Settings",e[e.Subtitle=52]="Subtitle",e[e.Audio=53]="Audio",e[e.Power=54]="Power",e[e.PointerX=100]="PointerX",e[e.PointerY=101]="PointerY",e[e.GyroX=102]="GyroX",e[e.GyroY=103]="GyroY",e[e.GyroZ=104]="GyroZ",e))(C||{});var z=(e=>(e.TerminalGL="webgl",e.Terminal2D="terminal2d",e.TerminalANSI="ansi",e))(z||{}),H=(e=>(e[e.None=0]="None",e[e.Eighth=1]="Eighth",e[e.Quarter=2]="Quarter",e[e.Half=3]="Half",e[e.Integer=4]="Integer",e[e.Responsive=5]="Responsive",e))(H||{});var G=(e=>(e[e.Char=1]="Char",e[e.Text=2]="Text",e[e.SubFrame=3]="SubFrame",e[e.SubFrameMulti=4]="SubFrameMulti",e[e.FullFrame=5]="FullFrame",e[e.FullFrameMulti=6]="FullFrameMulti",e[e.Sprite=7]="Sprite",e[e.SpriteMulti=8]="SpriteMulti",e[e.ColorMap=9]="ColorMap",e[e.Shape=10]="Shape",e[e.DotCloud=11]="DotCloud",e[e.DotCloudMulti=12]="DotCloudMulti",e[e.SpriteCloud=13]="SpriteCloud",e[e.SpriteCloudMulti=14]="SpriteCloudMulti",e[e.SpriteCloudVaried=15]="SpriteCloudVaried",e[e.SpriteCloudVariedMulti=16]="SpriteCloudVariedMulti",e[e.Bitmask=17]="Bitmask",e[e.Bitmask4=18]="Bitmask4",e[e.Fill=19]="Fill",e[e.FillChar=20]="FillChar",e[e.FillSprite=21]="FillSprite",e[e.FillSpriteMulti=22]="FillSpriteMulti",e[e.TextMultiline=23]="TextMultiline",e[e.Bitmask16=24]="Bitmask16",e[e.Polyline=25]="Polyline",e[e.Audio=32]="Audio",e[e.Vibration=33]="Vibration",e[e.PostProcess=34]="PostProcess",e))(G||{}),F=(e=>(e[e.Rectangle=1]="Rectangle",e[e.Circle=2]="Circle",e[e.Line=3]="Line",e[e.Ellipse=4]="Ellipse",e[e.Triangle=5]="Triangle",e))(F||{}),j=(e=>(e[e.FastPath=255]="FastPath",e[e.Fragment=254]="Fragment",e))(j||{});var N=(e=>(e[e.Enabled=1]="Enabled",e[e.SetMode=2]="SetMode",e[e.Position=4]="Position",e[e.ZOrder=8]="ZOrder",e[e.Orders=16]="Orders",e[e.IsMacroLayer=32]="IsMacroLayer",e[e.Is16BitMode=64]="Is16BitMode",e))(N||{}),J=(e=>(e.WAITING_FOR_WELCOME="waiting_for_welcome",e.AUTHENTICATING="authenticating",e.LOADING="loading",e.ACTIVE="active",e.DISCONNECTED="disconnected",e))(J||{});var f=class{isActive=!1;targetElement;config;constructor(e=window,t={}){this.targetElement=e,this.config={enabled:!0,preventDefault:!1,stopPropagation:!1,debug:!1,...t}}isListening(){return this.isActive}destroy(){this.stop()}getTargetElement(){return this.targetElement}enable(){this.config.enabled=!0,this.isActive||this.start()}disable(){this.config.enabled=!1,this.isActive&&this.stop()}isEnabled(){return this.config.enabled??!0}},V=class extends f{keys={};textInputsThisFrame=[];keyboardCallbacks={};boundHandlers;constructor(e=window,t={}){super(e,t),this.boundHandlers={keyDown:this.handleKeyDown.bind(this),keyUp:this.handleKeyUp.bind(this),blur:this.handleBlur.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.addEventListener("keyup",this.boundHandlers.keyUp),window.addEventListener("blur",this.boundHandlers.blur),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("keydown",this.boundHandlers.keyDown),this.targetElement.removeEventListener("keyup",this.boundHandlers.keyUp),window.removeEventListener("blur",this.boundHandlers.blur),this.isActive=!1)}reset(){this.keys={},this.textInputsThisFrame=[]}resetDelta(){}poll(){for(let e in this.keys)this.keys[e].justPressed=!1,this.keys[e].justReleased=!1;this.textInputsThisFrame=[]}setCallbacks(e){this.keyboardCallbacks={...this.keyboardCallbacks,...e}}getTextInputs(){return this.textInputsThisFrame}isKeyPressed(e){return this.keys[e]?.pressed||!1}isKeyJustPressed(e){return this.keys[e]?.justPressed||!1}isKeyJustReleased(e){return this.keys[e]?.justReleased||!1}getKeysJustPressed(){let e=[];for(let t in this.keys)this.keys[t].justPressed&&e.push(t);return e}getKeysHeld(){let e=[];for(let t in this.keys)this.keys[t].pressed&&e.push(t);return e}shouldAllowDefault(e,t){let s=/^F([1-9]|1[0-2])$/.test(e),o=(t.ctrlKey||t.metaKey)&&(e==="KeyT"||e==="KeyW"||e==="KeyR"||e==="KeyN"||e==="Tab");return s||o}handleKeyDown(e){let t=e.code,s=this.shouldAllowDefault(t,e);this.config.preventDefault&&!s&&e.preventDefault(),this.config.stopPropagation&&!s&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed||(this.keys[t].justPressed=!0,this.keyboardCallbacks.onKeyDown?.(t,e)),this.keys[t].pressed=!0,this.keys[t].justReleased=!1;let o=e.key;o.length===1&&!e.ctrlKey&&!e.metaKey&&this.textInputsThisFrame.push(o)}handleKeyUp(e){let t=e.code,s=this.shouldAllowDefault(t,e);this.config.preventDefault&&!s&&e.preventDefault(),this.config.stopPropagation&&!s&&e.stopPropagation(),this.keys[t]||(this.keys[t]={pressed:!1,justPressed:!1,justReleased:!1}),this.keys[t].pressed&&(this.keys[t].justReleased=!0,this.keyboardCallbacks.onKeyUp?.(t,e)),this.keys[t].pressed=!1,this.keys[t].justPressed=!1}handleBlur(){this.reset()}},U=class E extends f{mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}};mousePosition=new m(0,0);mouseDelta=new m(0,0);wheelDelta=0;boundHandlers;constructor(t=window,s={}){super(t,s),this.boundHandlers={mouseDown:this.handleMouseDown.bind(this),mouseUp:this.handleMouseUp.bind(this),mouseMove:this.handleMouseMove.bind(this),wheel:this.handleWheel.bind(this),contextMenu:this.handleContextMenu.bind(this),blur:this.handleBlur.bind(this)}}start(){this.isActive||(this.targetElement.addEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.addEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.addEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.addEventListener("wheel",this.boundHandlers.wheel),this.targetElement.addEventListener("contextmenu",this.boundHandlers.contextMenu),window.addEventListener("blur",this.boundHandlers.blur),this.isActive=!0)}stop(){this.isActive&&(this.targetElement.removeEventListener("mousedown",this.boundHandlers.mouseDown),this.targetElement.removeEventListener("mouseup",this.boundHandlers.mouseUp),this.targetElement.removeEventListener("mousemove",this.boundHandlers.mouseMove),this.targetElement.removeEventListener("wheel",this.boundHandlers.wheel),this.targetElement.removeEventListener("contextmenu",this.boundHandlers.contextMenu),window.removeEventListener("blur",this.boundHandlers.blur),this.isActive=!1)}reset(){this.mouseButtons={left:{pressed:!1,justPressed:!1,justReleased:!1},middle:{pressed:!1,justPressed:!1,justReleased:!1},right:{pressed:!1,justPressed:!1,justReleased:!1}},this.mousePosition=new m(0,0),this.mouseDelta=new m(0,0),this.wheelDelta=0}poll(){this.mouseButtons.left.justPressed=!1,this.mouseButtons.left.justReleased=!1,this.mouseButtons.middle.justPressed=!1,this.mouseButtons.middle.justReleased=!1,this.mouseButtons.right.justPressed=!1,this.mouseButtons.right.justReleased=!1,this.resetDelta()}resetDelta(){this.mouseDelta=new m(0,0),this.wheelDelta=0}isLeftMousePressed(){return this.mouseButtons.left.pressed}isLeftMouseJustPressed(){return this.mouseButtons.left.justPressed}isLeftMouseJustReleased(){return this.mouseButtons.left.justReleased}isRightMousePressed(){return this.mouseButtons.right.pressed}isRightMouseJustPressed(){return this.mouseButtons.right.justPressed}isRightMouseJustReleased(){return this.mouseButtons.right.justReleased}isMiddleMousePressed(){return this.mouseButtons.middle.pressed}getMousePosition(){return this.mousePosition.clone()}getMouseDelta(){return this.mouseDelta.clone()}getWheelDelta(){return this.wheelDelta}static BUTTON_NAMES=["left","middle","right"];handleMouseDown(t){this.config.preventDefault&&this.isInteractiveSurfaceEvent(t)&&t.preventDefault();let s=E.BUTTON_NAMES[t.button];if(s){let o=this.mouseButtons[s];o.pressed||(o.justPressed=!0),o.pressed=!0,o.justReleased=!1}}handleMouseUp(t){this.config.preventDefault&&this.isInteractiveSurfaceEvent(t)&&t.preventDefault();let s=E.BUTTON_NAMES[t.button];if(s){let o=this.mouseButtons[s];o.pressed&&(o.justReleased=!0),o.pressed=!1,o.justPressed=!1}}handleMouseMove(t){let s=new m(t.clientX,t.clientY);this.mouseDelta=s.subtract(this.mousePosition),this.mousePosition=s}handleWheel(t){this.config.preventDefault&&this.isInteractiveSurfaceEvent(t)&&t.preventDefault(),this.wheelDelta=t.deltaY}handleContextMenu(t){this.isInteractiveSurfaceEvent(t)&&t.preventDefault()}handleBlur(){this.reset()}isInteractiveSurfaceEvent(t){let s=t.target;return s?(s.tagName||"").toLowerCase()==="canvas"||(s.getAttribute?.("data-primitiv-input-surface")??"").toLowerCase()==="true"?!0:!!s.closest?.('canvas, [data-primitiv-input-surface="true"]'):!1}},W=class extends f{gamepads=new Map;previousGameState=new Map;rafId=null;boundHandlers;constructor(e=window,t={}){super(e,t),this.boundHandlers={connected:this.handleGamepadConnected.bind(this),disconnected:this.handleGamepadDisconnected.bind(this)}}start(){this.isActive||(window.addEventListener("gamepadconnected",this.boundHandlers.connected),window.addEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.startPolling(),this.isActive=!0)}stop(){this.isActive&&(window.removeEventListener("gamepadconnected",this.boundHandlers.connected),window.removeEventListener("gamepaddisconnected",this.boundHandlers.disconnected),this.stopPolling(),this.isActive=!1)}startPolling(){let e=()=>{this.poll(),this.rafId=requestAnimationFrame(e)};this.rafId=requestAnimationFrame(e)}stopPolling(){this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}poll(){let e=navigator.getGamepads();for(let t=0;t<e.length;t++){let s=e[t];s&&this.updateGamepadState(s)}}reset(){this.gamepads.clear(),this.previousGameState.clear()}resetDelta(){this.previousGameState.clear();for(let[e,t]of this.gamepads)this.previousGameState.set(e,this.cloneState(t))}updateGamepadState(e){let t=this.gamepads.get(e.index),s=e.buttons.map((o,u)=>{let i=t?.buttons[u],a=o.pressed,r=i?.pressed??!1;return{pressed:a,justPressed:a&&!r,justReleased:!a&&r,value:o.value,touched:o.touched}});this.gamepads.set(e.index,{id:e.id,index:e.index,connected:e.connected,buttons:s,axes:[...e.axes],timestamp:e.timestamp,mapping:e.mapping})}isButtonPressed(e,t){return this.gamepads.get(e)?.buttons[t]?.pressed??!1}isButtonJustPressed(e,t){return this.gamepads.get(e)?.buttons[t]?.justPressed??!1}isButtonJustReleased(e,t){return this.gamepads.get(e)?.buttons[t]?.justReleased??!1}getAxis(e,t){return this.gamepads.get(e)?.axes[t]??0}vibrationPresets={tap:{duration:50,strongMagnitude:.3,weakMagnitude:.5},impact:{duration:100,strongMagnitude:.7,weakMagnitude:.3},heavy:{duration:200,strongMagnitude:1,weakMagnitude:.2},success:{duration:150,strongMagnitude:.4,weakMagnitude:.6},error:{duration:300,strongMagnitude:.8,weakMagnitude:.4},explosion:{duration:400,strongMagnitude:1,weakMagnitude:.8}};async vibrate(e,t){let s=navigator.getGamepads()[e];if(!s||!s.vibrationActuator)return!1;try{return await s.vibrationActuator.playEffect("dual-rumble",{startDelay:t.startDelay??0,duration:t.duration,strongMagnitude:t.strongMagnitude??1,weakMagnitude:t.weakMagnitude??1}),!0}catch{return!1}}async vibratePreset(e,t){return this.vibrate(e,this.vibrationPresets[t])}async vibrateAll(e){let t=Array.from(this.gamepads.keys()).map(s=>this.vibrate(s,e));await Promise.all(t)}async stopVibration(e){let t=navigator.getGamepads()[e];if(t&&t.vibrationActuator)try{await t.vibrationActuator.reset()}catch{}}handleGamepadConnected(e){this.updateGamepadState(e.gamepad)}handleGamepadDisconnected(e){this.gamepads.delete(e.gamepad.index),this.previousGameState.delete(e.gamepad.index)}cloneState(e){return{...e,buttons:e.buttons.map(t=>({...t})),axes:[...e.axes]}}},q=class extends f{touches=new Map;nativeToInternal=new Map;maxTouches=10;boundHandlers;constructor(e=window,t={}){super(e,t),this.boundHandlers={touchStart:this.handleTouchStart.bind(this),touchEnd:this.handleTouchEnd.bind(this),touchMove:this.handleTouchMove.bind(this),touchCancel:this.handleTouchCancel.bind(this),visibilityChange:this.handleVisibilityChange.bind(this)}}start(){if(this.isActive)return;let e={passive:!this.config.preventDefault};this.targetElement.addEventListener("touchstart",this.boundHandlers.touchStart,e),this.targetElement.addEventListener("touchend",this.boundHandlers.touchEnd,e),this.targetElement.addEventListener("touchmove",this.boundHandlers.touchMove,e),this.targetElement.addEventListener("touchcancel",this.boundHandlers.touchCancel,e),document.addEventListener("visibilitychange",this.boundHandlers.visibilityChange),this.isActive=!0}stop(){this.isActive&&(this.targetElement.removeEventListener("touchstart",this.boundHandlers.touchStart),this.targetElement.removeEventListener("touchend",this.boundHandlers.touchEnd),this.targetElement.removeEventListener("touchmove",this.boundHandlers.touchMove),this.targetElement.removeEventListener("touchcancel",this.boundHandlers.touchCancel),document.removeEventListener("visibilitychange",this.boundHandlers.visibilityChange),this.isActive=!1)}poll(){let e=[];for(let[t,s]of this.touches)s.justReleased?e.push(t):(s.justPressed=!1,s.justReleased=!1);for(let t of e){let s=this.touches.get(t);s&&(this.nativeToInternal.delete(s.nativeId),this.touches.delete(t))}}reset(){this.touches.clear(),this.nativeToInternal.clear()}resetDelta(){}isTouchActive(e){return this.touches.get(e)?.active??!1}isTouchJustPressed(e){return this.touches.get(e)?.justPressed??!1}isTouchJustReleased(e){return this.touches.get(e)?.justReleased??!1}getTouchPosition(e){let t=this.touches.get(e);return t?{x:t.x,y:t.y}:null}getAllTouches(){return Array.from(this.touches.values()).filter(e=>e.active)}updateTouches(e){let t=new Set;for(let s=0;s<e.touches.length;s++){let o=e.touches[s],u=o.identifier;t.add(u);let i=this.nativeToInternal.get(u),a;if(i===void 0){if(this.touches.size>=this.maxTouches)continue;for(let d=0;d<this.maxTouches;d++)if(!this.touches.has(d)){i=d;break}if(i===void 0)continue;this.nativeToInternal.set(u,i),a=void 0}else a=this.touches.get(i);let r=!0,h=a?.active??!1;this.touches.set(i,{id:i,nativeId:u,active:r,justPressed:r&&!h,justReleased:!1,x:o.clientX,y:o.clientY,startX:a?.startX??o.clientX,startY:a?.startY??o.clientY})}for(let[s,o]of this.nativeToInternal)if(!t.has(s)){let u=this.touches.get(o);u&&u.active&&(u.active=!1,u.justReleased=!0)}}handleTouchStart(e){this.config.preventDefault&&e.preventDefault(),this.updateTouches(e)}handleTouchEnd(e){this.config.preventDefault&&e.preventDefault(),this.updateTouches(e)}handleTouchMove(e){this.config.preventDefault&&e.preventDefault(),this.updateTouches(e)}handleTouchCancel(e){this.handleTouchEnd(e)}handleVisibilityChange(){document.visibilityState==="hidden"&&this.reset()}},O=class extends f{constructor(e,t){super(t.targetElement,t),this.touch=e,this.gridWidth=t.gridWidth,this.gridHeight=t.gridHeight,t.zones&&this.setZones(t.zones)}zones=[];zoneStates=new Map;gridWidth;gridHeight;start(){this.isActive=!0}stop(){this.isActive=!1}reset(){this.zoneStates.clear()}resetDelta(){}setZones(e){this.zones=e;for(let t of e)this.zoneStates.has(t.id)||this.zoneStates.set(t.id,{pressed:!1,justPressed:!1,justReleased:!1,lastX:0,lastY:0})}updateFromTouches(){let e=this.targetElement.getBoundingClientRect(),t=e.width/this.gridWidth,s=e.height/this.gridHeight,o=this.touch.getAllTouches(),u=new Set;for(let i of o){let a=Math.floor((i.x-e.left)/t),r=Math.floor((i.y-e.top)/s);for(let h of this.zones)if(a>=h.x&&a<h.x+h.width&&r>=h.y&&r<h.y+h.height){u.add(h.id);let d=this.zoneStates.get(h.id);d.lastX=a,d.lastY=r}}for(let[i,a]of this.zoneStates){let r=u.has(i);r&&!a.pressed&&(a.justPressed=!0),!r&&a.pressed&&(a.justReleased=!0),a.pressed=r}}poll(){for(let e of this.zoneStates.values())e.justPressed=!1,e.justReleased=!1}isZonePressed(e){return this.zoneStates.get(e)?.pressed??!1}isZoneJustPressed(e){return this.zoneStates.get(e)?.justPressed??!1}isZoneJustReleased(e){return this.zoneStates.get(e)?.justReleased??!1}getZoneAxis(e,t){let s=this.zoneStates.get(e);if(!s||!s.pressed)return 0;let o=this.zones.find(u=>u.id===e);if(!o)return 0;if(t==="x"){let u=(o.width-1)/2,i=o.x+u;return u>0?(s.lastX-i)/u:0}else{let u=(o.height-1)/2,i=o.y+u;return u>0?(s.lastY-i)/u:0}}getZonePosition(e){let t=this.zoneStates.get(e);return t?{x:t.lastX,y:t.lastY}:null}},Q=class extends f{accelerometer={x:0,y:0,z:0,includesGravity:!1};gyroscope={alpha:0,beta:0,gamma:0};orientation={alpha:null,beta:null,gamma:null,absolute:!1};prevAccelerometer={x:0,y:0,z:0,includesGravity:!1};prevGyroscope={alpha:0,beta:0,gamma:0};motionCallbacks={};motionConfig;permissionGranted=!1;boundHandlers;constructor(e=window,t={}){super(e,t),this.motionConfig={targetElement:e,includeGravity:t.includeGravity??!1,threshold:t.threshold??.1,autoRequestPermission:t.autoRequestPermission??!1,enabled:t.enabled??!0,debug:t.debug??!1,preventDefault:t.preventDefault??!1,stopPropagation:t.stopPropagation??!1},this.boundHandlers={devicemotion:this.handleDeviceMotion.bind(this),deviceorientation:this.handleDeviceOrientation.bind(this)}}async requestPermission(){if(typeof DeviceMotionEvent.requestPermission=="function")try{let e=await DeviceMotionEvent.requestPermission();return this.permissionGranted=e==="granted",this.permissionGranted}catch{return!1}return this.permissionGranted=!0,!0}start(){this.isActive||(window.addEventListener("devicemotion",this.boundHandlers.devicemotion),window.addEventListener("deviceorientation",this.boundHandlers.deviceorientation),this.isActive=!0)}stop(){this.isActive&&(window.removeEventListener("devicemotion",this.boundHandlers.devicemotion),window.removeEventListener("deviceorientation",this.boundHandlers.deviceorientation),this.isActive=!1)}setCallbacks(e){this.motionCallbacks={...this.motionCallbacks,...e}}poll(){}reset(){this.accelerometer={x:0,y:0,z:0,includesGravity:!1},this.gyroscope={alpha:0,beta:0,gamma:0},this.orientation={alpha:null,beta:null,gamma:null,absolute:!1}}resetDelta(){this.prevAccelerometer={...this.accelerometer},this.prevGyroscope={...this.gyroscope}}getAccelerometer(){return{...this.accelerometer}}getGyroscope(){return{...this.gyroscope}}getOrientation(){return{...this.orientation}}getNormalizedTilt(){return new m(Math.max(-1,Math.min(1,this.accelerometer.x/9.81)),Math.max(-1,Math.min(1,this.accelerometer.y/9.81)))}handleDeviceMotion(e){let t=this.motionConfig.includeGravity?e.accelerationIncludingGravity:e.acceleration;if(t){let o={x:t.x??0,y:t.y??0,z:t.z??0,includesGravity:this.motionConfig.includeGravity};this.hasSignificantChange(this.prevAccelerometer,o)&&(this.accelerometer=o,this.motionCallbacks.onAccelerometer?.(o))}let s=e.rotationRate;if(s){let o={alpha:s.alpha??0,beta:s.beta??0,gamma:s.gamma??0};this.hasSignificantGyroChange(this.prevGyroscope,o)&&(this.gyroscope=o,this.motionCallbacks.onGyroscope?.(o))}}handleDeviceOrientation(e){this.orientation={alpha:e.alpha,beta:e.beta,gamma:e.gamma,absolute:e.absolute},this.motionCallbacks.onOrientation?.(this.orientation)}hasSignificantChange(e,t){let s=this.motionConfig.threshold;return Math.abs(t.x-e.x)>s||Math.abs(t.y-e.y)>s||Math.abs(t.z-e.z)>s}hasSignificantGyroChange(e,t){let s=this.motionConfig.threshold;return Math.abs(t.alpha-e.alpha)>s||Math.abs(t.beta-e.beta)>s||Math.abs(t.gamma-e.gamma)>s}},ie=class{keyboard=null;mouse=null;gamepad=null;touch=null;touchZone=null;motion=null;config;constructor(e={}){this.config={enableKeyboardMouse:e.enableKeyboardMouse??!0,enableGamepad:e.enableGamepad??!0,enableTouch:e.enableTouch??!0,targetElement:e.targetElement??window,gridWidth:e.gridWidth??80,gridHeight:e.gridHeight??25,debug:e.debug??!1},this.initialize()}initialize(){let e=this.config.targetElement;if(this.config.enableKeyboardMouse&&(this.keyboard=new V(e),this.mouse=new U(e)),this.config.enableGamepad&&(this.gamepad=new W(e)),this.config.enableTouch){this.touch=new q(e);let t=e instanceof Window?document.body:e;this.touchZone=new O(this.touch,{targetElement:t,gridWidth:this.config.gridWidth,gridHeight:this.config.gridHeight}),this.motion=new Q(e)}this.start()}getButton(e,t){switch(e){case n.Keyboard:return this.keyboard?.isKeyPressed(M[t])??!1;case n.Mouse:return this.getMouseButton(t);case n.Gamepad:return this.gamepad?.isButtonPressed(0,t)??!1;case n.Touch:return this.touch?.isTouchActive(t)??!1;case n.TouchZone:return this.touchZone?.isZonePressed(t)??!1;default:return!1}}getButtonJustPressed(e,t){switch(e){case n.Keyboard:return this.keyboard?.isKeyJustPressed(M[t])??!1;case n.Mouse:return this.getMouseButtonJustPressed(t);case n.Gamepad:return this.gamepad?.isButtonJustPressed(0,t)??!1;case n.Touch:return this.touch?.isTouchJustPressed?.(t)??!1;case n.TouchZone:return this.touchZone?.isZoneJustPressed(t)??!1;default:return!1}}getButtonJustReleased(e,t){switch(e){case n.Keyboard:return this.keyboard?.isKeyJustReleased(M[t])??!1;case n.Mouse:return this.getMouseButtonJustReleased(t);case n.Gamepad:return this.gamepad?.isButtonJustReleased(0,t)??!1;case n.Touch:return this.touch?.isTouchJustReleased?.(t)??!1;case n.TouchZone:return this.touchZone?.isZoneJustReleased(t)??!1;default:return!1}}getAxis(e,t){switch(e){case n.Mouse:return this.getMouseAxis(t);case n.Gamepad:return this.gamepad?.getAxis(0,t-100)??0;case n.Touch:return this.getTouchAxis(t);case n.TouchZone:return this.getTouchZoneAxis(t);default:return 0}}isLeftMousePressed(){return this.mouse?.isLeftMousePressed()??!1}getTextInputs(){return this.keyboard?.getTextInputs()??[]}getMouseButton(e){return this.mouse?e===c.LeftButton?this.mouse.isLeftMousePressed():e===c.RightButton?this.mouse.isRightMousePressed():e===c.MiddleButton?this.mouse.isMiddleMousePressed():!1:!1}getMouseButtonJustPressed(e){return this.mouse?e===c.LeftButton?this.mouse.isLeftMouseJustPressed():e===c.RightButton?this.mouse.isRightMouseJustPressed():!1:!1}getMouseButtonJustReleased(e){return this.mouse?e===c.LeftButton?this.mouse.isLeftMouseJustReleased():e===c.RightButton?this.mouse.isRightMouseJustReleased():!1:!1}getMouseAxis(e){return this.mouse?e===c.PositionX?this.mouse.getMousePosition().x:e===c.PositionY?this.mouse.getMousePosition().y:e===c.DeltaX?this.mouse.getMouseDelta().x:e===c.DeltaY?this.mouse.getMouseDelta().y:e===c.WheelDeltaY?this.mouse.getWheelDelta():0:0}getTouchAxis(e){if(!this.touch)return 0;if(e>=100&&e<200){let t=Math.floor((e-100)/2),s=(e-100)%2===1,o=this.touch.getTouchPosition(t);return o?s?o.y:o.x:0}return 0}getTouchZoneAxis(e){if(!this.touchZone)return 0;if(e>=100&&e<200){let t=Math.floor((e-100)/2),s=(e-100)%2===1;return this.touchZone.getZoneAxis(t,s?"y":"x")}return 0}getMouseGridX(){if(!this.mouse)return 0;let e=this.mouse.getMousePosition().x,t=this.config.targetElement,s,o;if(t instanceof Window)s=t.innerWidth,o=0;else{let u=t.getBoundingClientRect();s=u.width,o=u.left}return s===0?0:Math.floor((e-o)/s*this.config.gridWidth)}getMouseGridY(){if(!this.mouse)return 0;let e=this.mouse.getMousePosition().y,t=this.config.targetElement,s,o;if(t instanceof Window)s=t.innerHeight,o=0;else{let u=t.getBoundingClientRect();s=u.height,o=u.top}return s===0?0:Math.floor((e-o)/s*this.config.gridHeight)}isMouseButtonDown(e){return this.mouse?e===0?this.mouse.isLeftMousePressed():e===1?this.mouse.isMiddleMousePressed():e===2?this.mouse.isRightMousePressed():!1:!1}getKeysPressed(){return this.keyboard?.getKeysJustPressed()??[]}getKeysHeld(){return this.keyboard?.getKeysHeld()??[]}start(){this.keyboard?.start(),this.mouse?.start(),this.gamepad?.start(),this.touch?.start(),this.touchZone?.start(),this.motion?.start()}stop(){this.keyboard?.stop(),this.mouse?.stop(),this.gamepad?.stop(),this.touch?.stop(),this.touchZone?.stop(),this.motion?.stop()}reset(){this.keyboard?.reset(),this.mouse?.reset(),this.gamepad?.reset(),this.touch?.reset(),this.touchZone?.reset(),this.motion?.reset()}poll(){this.keyboard?.poll(),this.mouse?.poll(),this.gamepad?.poll(),this.touch?.poll(),this.touchZone?.updateFromTouches(),this.touchZone?.poll(),this.motion?.poll()}resetDelta(){this.keyboard?.resetDelta(),this.mouse?.resetDelta(),this.gamepad?.resetDelta(),this.touch?.resetDelta(),this.touchZone?.resetDelta(),this.motion?.resetDelta()}destroy(){this.stop(),this.keyboard?.destroy(),this.mouse?.destroy(),this.gamepad?.destroy(),this.touch?.destroy(),this.touchZone?.destroy(),this.motion?.destroy()}},ne=class R{static calculateRenderMetrics(t,s){let o=t.getBoundingClientRect(),u=t.width/t.height,i=o.width/o.height,a,r,h,d;u>i?(a=o.width,r=o.width/u,h=0,d=(o.height-r)/2):(a=o.height*u,r=o.height,h=(o.width-a)/2,d=0);let y=s?.offsetX||0,v=s?.offsetY||0;return h+=y,d+=v,a-=y*2,r-=v*2,{renderWidth:a,renderHeight:r,offsetX:h,offsetY:d,rect:o}}static collectAxisSources(t,s){let o=new Map;for(let u of t)for(let i of u.sources){if(o.has(i.sourceId))continue;let a=0,r=!1;if(i.type===n.Keyboard&&i.negativeKey!==void 0&&i.positiveKey!==void 0){let h=s.getButton(n.Keyboard,i.negativeKey);s.getButton(n.Keyboard,i.positiveKey)&&(a+=1),h&&(a-=1),r=!0}else if(i.type===n.Mouse&&i.mouseAxis!==void 0)a=s.getAxis(n.Mouse,i.mouseAxis),r=!0;else if(i.type===n.Gamepad&&i.axis!==void 0)a=s.getAxis(n.Gamepad,i.axis),r=!0;else if(i.type===n.Touch&&i.touchId!==void 0&&i.touchAxis!==void 0){let h=100+i.touchId*2,d=i.touchAxis==="x"?h:h+1;a=s.getAxis(n.Touch,d),r=!0}else if(i.type===n.TouchZone&&i.touchZoneId!==void 0&&i.touchZoneAxis!==void 0){let h=100+i.touchZoneId*2,d=i.touchZoneAxis==="x"?h:h+1;a=s.getAxis(n.TouchZone,d),r=!0}r&&o.set(i.sourceId,a)}return o}static collectButtonSources(t,s){let o=new Map;for(let u of t)for(let i of u.sources){if(o.has(i.sourceId))continue;let a=!1,r=!1;i.type===n.Keyboard&&i.key!==void 0?(a=s.getButton(n.Keyboard,i.key),r=!0):i.type===n.Mouse&&i.mouseButton!==void 0?(a=s.getButton(n.Mouse,i.mouseButton),r=!0):i.type===n.Gamepad&&i.button!==void 0?(a=s.getButton(n.Gamepad,i.button),r=!0):i.type===n.Touch&&i.touchButton!==void 0?(a=s.getButton(n.Touch,i.touchButton),r=!0):i.type===n.TouchZone&&i.touchZoneId!==void 0&&(a=s.getButton(n.TouchZone,i.touchZoneId),r=!0),r&&o.set(i.sourceId,a)}return o}static collectButtonSourcesWithTransitions(t,s){let o=new Map;for(let u of t)for(let i of u.sources){if(o.has(i.sourceId))continue;let a=!1,r=!1,h=!1,d=!1;i.type===n.Keyboard&&i.key!==void 0?(a=s.getButton(n.Keyboard,i.key),r=s.getButtonJustPressed(n.Keyboard,i.key),h=s.getButtonJustReleased(n.Keyboard,i.key),d=!0):i.type===n.Mouse&&i.mouseButton!==void 0?(a=s.getButton(n.Mouse,i.mouseButton),r=s.getButtonJustPressed(n.Mouse,i.mouseButton),h=s.getButtonJustReleased(n.Mouse,i.mouseButton),d=!0):i.type===n.Gamepad&&i.button!==void 0?(a=s.getButton(n.Gamepad,i.button),r=s.getButtonJustPressed(n.Gamepad,i.button),h=s.getButtonJustReleased(n.Gamepad,i.button),d=!0):i.type===n.Touch&&i.touchButton!==void 0?(a=s.getButton(n.Touch,i.touchButton),r=s.getButtonJustPressed(n.Touch,i.touchButton),h=s.getButtonJustReleased(n.Touch,i.touchButton),d=!0):i.type===n.TouchZone&&i.touchZoneId!==void 0&&(a=s.getButton(n.TouchZone,i.touchZoneId),r=s.getButtonJustPressed(n.TouchZone,i.touchZoneId),h=s.getButtonJustReleased(n.TouchZone,i.touchZoneId),d=!0),d&&o.set(i.sourceId,{pressed:a,justPressed:r,justReleased:h})}return o}static collectMousePosition(t,s,o,u,i){let a=t.getAxis(n.Mouse,100),r=t.getAxis(n.Mouse,101),h=t.getButton(n.Mouse,0),{renderWidth:d,renderHeight:y,offsetX:v,offsetY:T,rect:w}=R.calculateRenderMetrics(s,i),b=a-w.left-v,p=r-w.top-T,x=d/o,P=y/u,D=Math.floor(b/x),B=Math.floor(p/P),Z=b>=0&&b<d&&p>=0&&p<y;return{x:Math.max(0,Math.min(o-1,D)),y:Math.max(0,Math.min(u-1,B)),over:Z,isLeftDown:h}}static collectTouchPositions(t,s,o,u,i=10,a){let r=[],{renderWidth:h,renderHeight:d,offsetX:y,offsetY:v,rect:T}=R.calculateRenderMetrics(s,a),w=h/o,b=d/u;for(let p=0;p<i;p++)if(t.getButton(n.Touch,p)){let x=100+p*2,P=100+p*2+1,D=t.getAxis(n.Touch,x),B=t.getAxis(n.Touch,P),Z=D-T.left-y,S=B-T.top-v,k=Math.floor(Z/w),Y=Math.floor(S/b),X=Z>=0&&Z<h&&S>=0&&S<d;r.push({id:p,x:Math.max(0,Math.min(o-1,k)),y:Math.max(0,Math.min(u-1,Y)),over:X})}return r}static collectTextInputs(t){return typeof t.getTextInputs=="function"?t.getTextInputs():[]}},g={tap:10,mediumTap:25,heavyTap:50,success:[30,50,30],error:[50,30,50,30,50],warning:[100],selection:5,impactLight:15,impactMedium:30,impactHeavy:50,notification:[100,100,100,100,100],sos:[100,30,100,30,100,30,200,30,200,30,200,30,100,30,100,30,100]},$=class{enabled;intensity;supported;userActivated=!1;constructor(e={}){this.enabled=e.enabled??!0,this.intensity=Math.max(0,Math.min(1,e.intensity??1)),this.supported=typeof navigator<"u"&&typeof navigator.vibrate=="function"}isSupported(){return this.supported}isEnabled(){return this.enabled&&this.supported}setEnabled(e){this.enabled=e}setIntensity(e){this.intensity=Math.max(0,Math.min(1,e))}getIntensity(){return this.intensity}hasUserActivation(){return this.userActivated}vibrate(e){if(!this.isEnabled())return!1;let t=this.scalePattern(e),s=navigator.vibrate(t);return s&&(this.userActivated=!0),s}cancel(){this.supported&&navigator.vibrate(0)}tap(){return this.vibrate(g.tap)}mediumTap(){return this.vibrate(g.mediumTap)}heavyTap(){return this.vibrate(g.heavyTap)}success(){return this.vibrate(g.success)}error(){return this.vibrate(g.error)}warning(){return this.vibrate(g.warning)}selection(){return this.vibrate(g.selection)}impactLight(){return this.vibrate(g.impactLight)}impactMedium(){return this.vibrate(g.impactMedium)}impactHeavy(){return this.vibrate(g.impactHeavy)}notification(){return this.vibrate(g.notification)}scalePattern(e){return this.intensity===1?e:typeof e=="number"?Math.round(e*this.intensity):e.map((t,s)=>s%2===0?Math.round(t*this.intensity):t)}},A=null;function ae(e){return A||(A=new $(e)),A}export{f as BaseInputs,W as GamepadInputs,ne as InputCollector,ie as InputRouter,V as KeyboardInputs,$ as MobileVibration,Q as MotionInputs,U as MouseInputs,q as TouchInputs,O as TouchZoneInputs,g as VibrationPatterns,ae as getMobileVibration};
|
package/dist/network.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var B=Object.defineProperty;var ie=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var le=Object.prototype.hasOwnProperty;var ce=(e,t)=>{for(var n in t)B(e,n,{get:t[n],enumerable:!0})},he=(e,t,n,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of oe(t))!le.call(e,r)&&r!==n&&B(e,r,{get:()=>t[r],enumerable:!(a=ie(t,r))||a.enumerable});return e};var de=e=>he(B({},"__esModule",{value:!0}),e);var Qe={};ce(Qe,{CallbackSectionType:()=>m,DC_RELIABLE:()=>H,DC_UNRELIABLE:()=>W,FragmentAssembler:()=>x,HEADER_SIZE_FRAG:()=>ge,HEADER_SIZE_SINGLE:()=>ue,HandshakeClient:()=>re,HandshakeState:()=>d,HandshakeStatus:()=>p,InterleavingManager:()=>P,LoopbackTransport:()=>Ue,MTU:()=>fe,Marker:()=>l,NetworkClient:()=>He,Tick:()=>k,TransportState:()=>h,UWebSocketClient:()=>We,WebRTCClient:()=>Ve,calculateFragmentCount:()=>pe,createPacket:()=>v,decodeClientCallback:()=>ve,decodeHeader:()=>O,encodeClientCallback:()=>we,encodeHeader:()=>ke,extractPayload:()=>be,fragmentPacket:()=>D,isFragMarker:()=>M,isReliableMarker:()=>F,toFragMarker:()=>N,willFragment:()=>me});module.exports=de(Qe);var ue=9,ge=13,fe=1200,l={HandshakeRequest:1,HandshakeResponse:2,HandshakeStateClient:3,HandshakeStateServer:4,Ping:5,Pong:6,LoadBundle:16,LoadBundleFrag:17,UpdateReliable:32,UpdateReliableFrag:33,UpdateVolatile:34,UpdateVolatileFrag:35,EmptyUpdate:36,InputReliable:48,InputReliableFrag:49,InputVolatile:50,InputVolatileFrag:51,AudioOrder:64,HapticOrder:65,PostProcessOrder:66,MacroOrder:67,BridgeToServer:80,BridgeToServerFrag:81,BridgeToClient:82,BridgeToClientFrag:83,ClientCallback:96,ClientCallbackFrag:97};function M(e){return e===l.LoadBundleFrag||e===l.UpdateReliableFrag||e===l.UpdateVolatileFrag||e===l.InputReliableFrag||e===l.InputVolatileFrag||e===l.BridgeToServerFrag||e===l.BridgeToClientFrag||e===l.ClientCallbackFrag}function N(e){switch(e){case l.LoadBundle:return l.LoadBundleFrag;case l.UpdateReliable:return l.UpdateReliableFrag;case l.UpdateVolatile:return l.UpdateVolatileFrag;case l.InputReliable:return l.InputReliableFrag;case l.InputVolatile:return l.InputVolatileFrag;case l.BridgeToServer:return l.BridgeToServerFrag;case l.BridgeToClient:return l.BridgeToClientFrag;case l.ClientCallback:return l.ClientCallbackFrag;default:return e}}function F(e){return e<=15||e===l.LoadBundle||e===l.LoadBundleFrag||e===l.UpdateReliable||e===l.UpdateReliableFrag||e===l.InputReliable||e===l.InputReliableFrag||e>=80}var p=(e=>(e[e.OK=0]="OK",e[e.VersionMismatch=1]="VersionMismatch",e[e.ServerFull=2]="ServerFull",e[e.AuthFailed=3]="AuthFailed",e))(p||{}),d=(e=>(e[e.Connected=0]="Connected",e[e.WaitingForResponse=1]="WaitingForResponse",e[e.Authenticating=2]="Authenticating",e[e.LoadingAssets=3]="LoadingAssets",e[e.Ready=4]="Ready",e[e.InSimulation=5]="InSimulation",e[e.Disconnected=255]="Disconnected",e))(d||{}),k=class w{high;low;constructor(t,n){this.high=t>>>0,this.low=n>>>0}static ZERO=new w(0,0);static from(t){let n=Number(t>>32n&0xffffffffn),a=Number(t&0xffffffffn);return new w(n,a)}static fromNumber(t){if(t<0)throw new Error("Tick must be positive");let n=Math.floor(t/4294967296),a=t>>>0;return new w(n,a)}static fromBuffer(t,n=0){let a=(t[n]<<24|t[n+1]<<16|t[n+2]<<8|t[n+3])>>>0,r=(t[n+4]<<24|t[n+5]<<16|t[n+6]<<8|t[n+7])>>>0;return new w(a,r)}toBigInt(){return BigInt(this.high)<<32n|BigInt(this.low)}toNumber(){return this.high*4294967296+this.low}toBuffer(){let t=new Uint8Array(8);return this.writeToBuffer(t,0),t}writeToBuffer(t,n=0){t[n]=this.high>>>24&255,t[n+1]=this.high>>>16&255,t[n+2]=this.high>>>8&255,t[n+3]=this.high&255,t[n+4]=this.low>>>24&255,t[n+5]=this.low>>>16&255,t[n+6]=this.low>>>8&255,t[n+7]=this.low&255}increment(){let t=this.low+1,n=this.high;return t>4294967295&&(t=0,n++),new w(n,t)}compare(t){return this.high!==t.high?this.high-t.high:this.low-t.low}equals(t){return this.high===t.high&&this.low===t.low}isZero(){return this.high===0&&this.low===0}toString(){return`Tick(${this.toBigInt()})`}getHigh(){return this.high}getLow(){return this.low}};function ke(e){let t=e.fragInfo!==void 0?13:9,n=new Uint8Array(t);return Z(e,n,0),n}function Z(e,t,n){let a=e.fragInfo!==void 0;return t[n]=e.marker,a&&e.fragInfo?(t[n+1]=e.fragInfo.totalChunks>>>8&255,t[n+2]=e.fragInfo.totalChunks&255,t[n+3]=e.fragInfo.chunkIndex>>>8&255,t[n+4]=e.fragInfo.chunkIndex&255,e.tick.writeToBuffer(t,n+5),13):(e.tick.writeToBuffer(t,n+1),9)}function O(e){if(e.length<9)throw new Error(`Buffer too small for header: ${e.length} < 9`);let t=e[0];if(M(t)){if(e.length<13)throw new Error(`Buffer too small for frag header: ${e.length} < 13`);let a=e[1]<<8|e[2],r=e[3]<<8|e[4],s=k.fromBuffer(e,5);return{header:{marker:t,tick:s,fragInfo:{totalChunks:a,chunkIndex:r}},payloadOffset:13}}let n=k.fromBuffer(e,1);return{header:{marker:t,tick:n},payloadOffset:9}}function v(e,t){let n=e.fragInfo!==void 0?13:9,a=t?t.length:0,r=new Uint8Array(n+a);return Z(e,r,0),a>0&&r.set(t,n),r}function be(e){let{header:t,payloadOffset:n}=O(e),a=e.slice(n);return{header:t,payload:a}}function D(e,t,n,a){let r=a?.mtu??1200,s=r-13;if(n.length+9<=r)return[v({marker:e,tick:t},n)];let i=N(e);if(i===e)throw new Error(`Packet with marker 0x${e.toString(16)} exceeds MTU (${r}) but has no fragmentation variant.`);let o=Math.ceil(n.length/s),c=[];for(let g=0;g<o;g++){let u=g*s,U=Math.min(u+s,n.length),R=n.subarray(u,U),f={marker:i,tick:t,fragInfo:{totalChunks:o,chunkIndex:g}};c.push(v(f,R))}return c}function pe(e,t=1200){if(e+9<=t)return 1;let n=t-13;return Math.ceil(e/n)}function me(e,t=1200){return e+9>t}function ye(e,t){return`${e}:${t.getHigh()}:${t.getLow()}`}var x=class{buckets=new Map;ttlMs;constructor(e){this.ttlMs=e?.ttlMs??1e4}receive(e){let{header:t,payloadOffset:n}=O(e),a=e.subarray(n);return!M(t.marker)||!t.fragInfo?{marker:t.marker,tick:t.tick,payload:a}:this.handleFragment(t,a)}handleFragment(e,t){let{marker:n,tick:a,fragInfo:r}=e;if(!r)return null;let s=ye(n,a),i=this.buckets.get(s);if(i||(i={marker:n,tick:a,totalChunks:r.totalChunks,receivedCount:0,chunks:new Array(r.totalChunks).fill(null),createdAt:Date.now()},this.buckets.set(s,i)),r.chunkIndex>=i.totalChunks)return null;if(i.chunks[r.chunkIndex]===null&&(i.chunks[r.chunkIndex]=t,i.receivedCount++),i.receivedCount===i.totalChunks){let o=0;for(let u=0;u<i.chunks.length;u++)i.chunks[u]&&(o+=i.chunks[u].length);let c=new Uint8Array(o),g=0;for(let u of i.chunks)u&&(c.set(u,g),g+=u.length);return this.buckets.delete(s),{marker:n,tick:a,payload:c}}return null}cleanup(){let e=Date.now(),t=0;for(let[n,a]of this.buckets)e-a.createdAt>this.ttlMs&&(this.buckets.delete(n),t++);return t}getPendingCount(){return this.buckets.size}clearTick(e){for(let[t,n]of this.buckets)n.tick.equals(e)&&this.buckets.delete(t)}destroy(){this.buckets.clear()}},P=class{transport;backgroundQueue=[];immediateQueue=[];bgCursor=0;imCursor=0;options;constructor(e,t={}){this.transport=e,this.options={fragmentsPerTick:t.fragmentsPerTick??5,bufferedThreshold:t.bufferedThreshold??16384}}enqueue(e,t,n){let a=F(e),r=D(e,t,n);for(let s of r)this.backgroundQueue.push({data:s,reliable:a})}enqueueImmediate(e,t,n){let a=F(e),r=D(e,t,n);for(let s of r)this.immediateQueue.push({data:s,reliable:a})}enqueueRawImmediate(e,t){this.immediateQueue.push({data:e,reliable:t})}flush(){if(!this.transport.isReady())return;for(;this.imCursor<this.immediateQueue.length;){let n=this.immediateQueue[this.imCursor++];this.transport.send(n.data,n.reliable)}this.imCursor>0&&(this.immediateQueue.length=0,this.imCursor=0);let e=0,t=this.options.fragmentsPerTick;for(;this.bgCursor<this.backgroundQueue.length&&e<t&&this.transport.getBufferedAmount()<this.options.bufferedThreshold;){let n=this.backgroundQueue[this.bgCursor++];this.transport.send(n.data,n.reliable),e++}this.bgCursor>0&&this.bgCursor>=this.backgroundQueue.length?(this.backgroundQueue.length=0,this.bgCursor=0):this.bgCursor>256&&(this.backgroundQueue.splice(0,this.bgCursor),this.bgCursor=0)}clear(){this.backgroundQueue.length=0,this.immediateQueue.length=0,this.bgCursor=0,this.imCursor=0}getPendingCount(){return this.backgroundQueue.length-this.bgCursor}hasImmediatePending(){return this.imCursor<this.immediateQueue.length}},m={AudioAck:1,MacroFeedback:2},j=1,K=2,z=3,G=4,J=5,C=new TextEncoder,S=new TextDecoder;function we(e){let t=[];if(e.audioAcks.length>0&&t.push({type:m.AudioAck,payload:Ce(e.audioAcks)}),e.macroFeedbacks.length>0&&t.push({type:m.MacroFeedback,payload:Se(e.macroFeedbacks)}),t.length===0)return new Uint8Array(0);let n=1;for(let s of t)n+=2+s.payload.byteLength;let a=new Uint8Array(n),r=0;a[r++]=t.length;for(let s of t)a[r++]=s.type,s.type===m.AudioAck?a[r++]=e.audioAcks.length:s.type===m.MacroFeedback?a[r++]=e.macroFeedbacks.length:a[r++]=0,a.set(s.payload,r),r+=s.payload.byteLength;return a}function Ce(e){let t=0,n=[];for(let i of e)switch(i.type){case"sound-loaded":{let o=C.encode(i.name);n.push({name:o}),t+=4+o.byteLength;break}case"sound-error":{let o=C.encode(i.name),c=C.encode(i.error);n.push({name:o,error:c}),t+=4+o.byteLength+1+c.byteLength;break}case"playback-started":n.push({}),t+=7;break;case"playback-ended":n.push({}),t+=7;break;case"playback-error":{let o=C.encode(i.error);n.push({error:o}),t+=2+(i.instanceId!=null?4:0)+2+1+o.byteLength;break}}let a=new Uint8Array(t),r=new DataView(a.buffer),s=0;for(let i=0;i<e.length;i++){let o=e[i],c=n[i];switch(o.type){case"sound-loaded":a[s++]=j,r.setUint16(s,o.soundId,!1),s+=2,a[s++]=c.name.byteLength,a.set(c.name,s),s+=c.name.byteLength;break;case"sound-error":a[s++]=K,r.setUint16(s,o.soundId,!1),s+=2,a[s++]=c.name.byteLength,a.set(c.name,s),s+=c.name.byteLength,a[s++]=c.error.byteLength,a.set(c.error,s),s+=c.error.byteLength;break;case"playback-started":a[s++]=z,r.setUint32(s,o.instanceId,!1),s+=4,r.setUint16(s,o.soundId,!1),s+=2;break;case"playback-ended":a[s++]=G,r.setUint32(s,o.instanceId,!1),s+=4,r.setUint16(s,o.soundId,!1),s+=2;break;case"playback-error":{a[s++]=J;let g=o.instanceId!=null?1:0;a[s++]=g,g&&(r.setUint32(s,o.instanceId,!1),s+=4);let u=typeof o.sound=="number"?o.sound:0;r.setUint16(s,u,!1),s+=2,a[s++]=c.error.byteLength,a.set(c.error,s),s+=c.error.byteLength;break}}}return a}function Se(e){let t=0,n=[];for(let i of e)switch(t+=3,i.cmd){case 1:n.push(null);break;case 2:n.push(null),t+=1+(i.valueType==="number"?2:1);break;case 3:{let o=C.encode(i.text);n.push(o),t+=2+o.byteLength;break}case 4:n.push(null),t+=2;break;case 5:{let o=C.encode(i.data);n.push(o),t+=2+o.byteLength;break}}let a=new Uint8Array(t),r=new DataView(a.buffer),s=0;for(let i=0;i<e.length;i++){let o=e[i];switch(a[s++]=o.cmd,r.setUint16(s,o.instanceId,!1),s+=2,o.cmd){case 1:break;case 2:o.valueType==="number"?(a[s++]=0,r.setUint16(s,o.value,!1),s+=2):(a[s++]=1,a[s++]=o.value?1:0);break;case 3:{let c=n[i];r.setUint16(s,c.byteLength,!1),s+=2,a.set(c,s),s+=c.byteLength;break}case 4:r.setUint16(s,o.index,!1),s+=2;break;case 5:{let c=n[i];r.setUint16(s,c.byteLength,!1),s+=2,a.set(c,s),s+=c.byteLength;break}}}return a}function ve(e){let t={audioAcks:[],macroFeedbacks:[]};if(e.byteLength===0)return t;let n=new DataView(e.buffer,e.byteOffset,e.byteLength),a=0,r=e[a++];for(let s=0;s<r;s++){let i=e[a++],o=e[a++];switch(i){case m.AudioAck:for(let c=0;c<o;c++){let{ack:g,newOffset:u}=Ie(e,n,a);t.audioAcks.push(g),a=u}break;case m.MacroFeedback:for(let c=0;c<o;c++){let{feedback:g,newOffset:u}=Ae(e,n,a);t.macroFeedbacks.push(g),a=u}break;default:break}}return t}function Ie(e,t,n){let a=e[n++];switch(a){case j:{let r=t.getUint16(n,!1);n+=2;let s=e[n++],i=S.decode(e.subarray(n,n+s));return n+=s,{ack:{type:"sound-loaded",soundId:r,name:i},newOffset:n}}case K:{let r=t.getUint16(n,!1);n+=2;let s=e[n++],i=S.decode(e.subarray(n,n+s));n+=s;let o=e[n++],c=S.decode(e.subarray(n,n+o));return n+=o,{ack:{type:"sound-error",soundId:r,name:i,error:c},newOffset:n}}case z:{let r=t.getUint32(n,!1);n+=4;let s=t.getUint16(n,!1);return n+=2,{ack:{type:"playback-started",instanceId:r,soundId:s},newOffset:n}}case G:{let r=t.getUint32(n,!1);n+=4;let s=t.getUint16(n,!1);return n+=2,{ack:{type:"playback-ended",instanceId:r,soundId:s},newOffset:n}}case J:{let r=e[n++],s=r?t.getUint32(n,!1):void 0;r&&(n+=4);let i=t.getUint16(n,!1);n+=2;let o=e[n++],c=S.decode(e.subarray(n,n+o));return n+=o,{ack:{type:"playback-error",instanceId:s,sound:i,error:c},newOffset:n}}default:throw new Error(`Unknown AudioAck sub-type: 0x${a.toString(16)}`)}}function Ae(e,t,n){let a=e[n++],r=t.getUint16(n,!1);switch(n+=2,a){case 1:return{feedback:{cmd:1,instanceId:r},newOffset:n};case 2:{let s=e[n++]===0?"number":"boolean",i;return s==="number"?(i=t.getUint16(n,!1),n+=2):i=e[n++]!==0,{feedback:{cmd:2,instanceId:r,valueType:s,value:i},newOffset:n}}case 3:{let s=t.getUint16(n,!1);n+=2;let i=S.decode(e.subarray(n,n+s));return n+=s,{feedback:{cmd:3,instanceId:r,text:i},newOffset:n}}case 4:{let s=t.getUint16(n,!1);return n+=2,{feedback:{cmd:4,instanceId:r,index:s},newOffset:n}}case 5:{let s=t.getUint16(n,!1);n+=2;let i=S.decode(e.subarray(n,n+s));return n+=s,{feedback:{cmd:5,instanceId:r,data:i},newOffset:n}}default:throw new Error(`Unknown MacroFeedback cmd: 0x${a.toString(16)}`)}}var h=(e=>(e[e.Connecting=0]="Connecting",e[e.Open=1]="Open",e[e.Closing=2]="Closing",e[e.Closed=3]="Closed",e))(h||{}),Ue=class{onMessage=null;onStateChange=null;onError=null;send(e,t){this.onMessage?.(e)}getState(){return 1}getBufferedAmount(){return 0}isReady(){return!0}close(e,t){}},H="reliable",W="unreliable";var T={trace:0,debug:1,info:2,warn:3,error:4,silent:5},b=[],Q="info",E=new Map,y=new Map,Re=typeof performance<"u"&&typeof performance.now=="function"?()=>performance.now():()=>Date.now(),L=null;function ee(e){let t=null,n=-1;for(let[a,r]of E)if(Te(a,e)){let s=a.length;s>n&&(n=s,t=r)}return t??Q}function Te(e,t){if(e==="*")return!0;if(e.endsWith(":*")){let n=e.slice(0,-1);return t===e.slice(0,-2)||t.startsWith(n)}return e===t}function Y(){for(let[e,t]of y)t.c(ee(e))}var $=class I{namespace;r;i;s;constructor(t,n,a){this.namespace=t,this.i=n,this.s=a,this.r=T[ee(t)]}static create(t){let n=y.get(t);return n||(n=new I(t),y.set(t,n)),n}child(t){return I.create(`${this.namespace}:${t}`)}forClient(t,n){let a=`${this.namespace}:client:${t}`,r=y.get(a);return r?(r.i=t,r.s=n):(r=new I(a,t,n),y.set(a,r)),r}static dispose(t){y.delete(t)}trace(t,n){this.n("trace",t,n)}debug(t,n){this.n("debug",t,n)}info(t,n){this.n("info",t,n)}warn(t,n){this.n("warn",t,n)}error(t,n){this.n("error",t,n)}isEnabled(t){return T[t]>=this.r}c(t){this.r=T[t]}n(t,n,a){if(T[t]<this.r||b.length===0)return;let r=typeof n=="function"?n():n,s={timestamp:Re(),level:t,namespace:this.namespace,message:r};L!==null&&(s.tick=L()),a!==void 0&&(s.data=a),this.i!==void 0&&(s.clientId=this.i),this.s!==void 0&&(s.username=this.s);for(let i=0;i<b.length;i++)b[i](s)}static setLevel(t,n){n===void 0?Q=t:E.set(t,n),Y()}static clearLevelOverrides(){E.clear(),Y()}static enable(t){I.setLevel(t,"trace")}static disable(t){I.setLevel(t,"silent")}static addHandler(t){return b.push(t),()=>{let n=b.indexOf(t);n!==-1&&b.splice(n,1)}}static clearHandlers(){b.length=0}static get handlerCount(){return b.length}static setTickProvider(t){L=t}static reset(){b.length=0,E.clear(),y.clear(),Q="info",L=null}},A="\x1B[0m",Le={trace:"\x1B[90m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m"},Ee="\x1B[35m",X="\x1B[2m",$e="\x1B[93m",Be={trace:"color:#888",debug:"color:#0cc",info:"color:#0a0",warn:"color:#cc0",error:"color:#c00;font-weight:bold"},Fe="color:#c0c;font-weight:bold",_="color:#888",De="color:#c90;font-weight:bold",te={trace:"debug",debug:"debug",info:"info",warn:"warn",error:"error"},Me=typeof globalThis<"u"&&typeof globalThis.process=="object"&&typeof globalThis.process?.versions=="object";function V(e,t){return String(e).padStart(t,"0")}function ne(e){let t=Math.floor(e/1e3)%60,n=Math.floor(e/6e4)%60,a=Math.floor(e%1e3);return`${V(n,2)}:${V(t,2)}.${V(a,3)}`}function ae(e){return e.toUpperCase().padEnd(5)}function se(e){if(e.clientId===void 0)return"";let t=e.username?`/${e.username}`:"";return` [client:${e.clientId}${t}]`}function Oe(e){let t=`${X}${ne(e.timestamp)}${A}`,n=e.tick!==void 0?` ${$e}#${e.tick}${A}`:"",a=`${Le[e.level]}${ae(e.level)}${A}`,r=`${Ee}${e.namespace}${A}`,s=e.clientId!==void 0?`${X}${se(e)}${A}`:"",i=te[e.level],o=`${t}${n} ${a} ${r}${s}`;e.data!==void 0?console[i](o,e.message,e.data):console[i](o,e.message)}function xe(e){let t=te[e.level],n=se(e),a=e.tick!==void 0?` %c#${e.tick}`:"",r=e.tick!==void 0?[De]:[],s=`%c${ne(e.timestamp)}${a} %c${ae(e.level)} %c${e.namespace}%c${n} %c${e.message}`,i=[_,...r,Be[e.level],Fe,_,""];e.data!==void 0?console[t](s,...i,e.data):console[t](s,...i)}var Pe=Me?Oe:xe;$.handlerCount===0&&$.addHandler(Pe);var re=class{state=d.Connected;transport=null;serverConfig=null;callbacks;constructor(e={}){this.callbacks=e}bind(e){this.transport=e}getState(){return this.state}getServerConfig(){return this.serverConfig}sendRequest(e){if(!this.transport)throw new Error("Transport not bound");if(this.state!==d.Connected){this.callbacks.onError?.(`Cannot send HandshakeRequest in state ${this.state}`);return}let t=new Uint8Array(3);t[0]=e.major,t[1]=e.minor,t[2]=e.patch;let n={marker:l.HandshakeRequest,tick:k.ZERO};this.transport.send(v(n,t),!0),this.setState(d.WaitingForResponse)}sendAuth(e,t){if(!this.transport)throw new Error("Transport not bound");if(this.state!==d.Authenticating){this.callbacks.onError?.(`Cannot send Auth in state ${this.state}`);return}let n=new TextEncoder().encode(e),a=new TextEncoder().encode(t),r=new Uint8Array(2+n.length+a.length);r[0]=n.length,r.set(n,1),r[1+n.length]=a.length,r.set(a,2+n.length),this.sendState(d.Authenticating,r)}sendLoadingProgress(e){if(this.state!==d.LoadingAssets)return;let t=new Uint8Array([Math.min(100,Math.max(0,e))]);this.sendState(d.LoadingAssets,t)}sendReady(){if(this.state!==d.LoadingAssets){this.callbacks.onError?.(`Cannot send Ready in state ${this.state}`);return}this.sendState(d.Ready)}handleResponse(e){if(this.state!==d.WaitingForResponse){this.callbacks.onError?.(`Unexpected HandshakeResponse in state ${this.state}`);return}if(e.length<14){this.callbacks.onError?.("Invalid HandshakeResponse: too short");return}let t=e[0],n=e[1],a=e[2],r=k.fromBuffer(e,3),s=e[11]<<8|e[12],i=e[13];if(this.serverConfig={status:t,serverVersion:{major:n,minor:a},startTick:r,clientId:s,tickRate:i},this.callbacks.onServerConfig?.(this.serverConfig),t!==p.OK){let o={[p.OK]:"",[p.VersionMismatch]:"Version mismatch",[p.ServerFull]:"Server full",[p.AuthFailed]:"Authentication failed"};this.callbacks.onError?.(o[t]||"Unknown error"),this.setState(d.Disconnected);return}this.setState(d.Authenticating)}handleServerState(e){if(e.length<1)return;let t=e[0];switch(t){case d.LoadingAssets:if(this.state!==d.Authenticating){this.callbacks.onError?.(`Unexpected LoadingAssets from server in state ${this.state}`);return}this.setState(d.LoadingAssets);break;case d.Ready:if(this.state!==d.LoadingAssets){this.callbacks.onError?.(`Unexpected Ready from server in state ${this.state}`);return}this.setState(d.Ready);break;case d.InSimulation:if(this.state!==d.Ready&&this.state!==d.LoadingAssets){this.callbacks.onError?.(`Unexpected InSimulation from server in state ${this.state}`);return}this.setState(d.InSimulation),this.callbacks.onReady?.();break;case d.Disconnected:if(e.length>2){let n=e[1],a=new TextDecoder().decode(e.slice(2,2+n));this.callbacks.onError?.(a)}this.setState(d.Disconnected);break;default:this.callbacks.onError?.(`Unknown server state: 0x${t.toString(16)}`);break}}sendState(e,t){if(!this.transport)throw new Error("Transport not bound");let n=new Uint8Array(1+(t?.length??0));n[0]=e,t&&n.set(t,1);let a={marker:l.HandshakeStateClient,tick:k.ZERO};this.transport.send(v(a,n),!0)}setState(e){this.state=e,this.callbacks.onStateChange?.(e)}isComplete(){return this.state===d.InSimulation}},He=class{transport=null;assembler;interleaving=null;handshake;callbacks;options;currentTick=k.ZERO;t=0;n=0;constructor(e,t={}){this.options=e,this.callbacks=t,this.assembler=new x,this.handshake=new re({onStateChange:n=>this.callbacks.onHandshakeState?.(n),onServerConfig:n=>{this.currentTick=n.startTick,this.callbacks.onServerConfig?.(n)},onError:n=>this.callbacks.onError?.(n),onReady:()=>this.callbacks.onSimulationStart?.()})}async connect(e,t){this.transport=e,this.interleaving=new P(e),e.onMessage=n=>this.handleMessage(n),e.onStateChange=n=>{n===h.Closed&&this.callbacks.onDisconnect?.("Transport closed")},e.onError=n=>this.callbacks.onError?.(n.message),await e.connect(t),this.handshake.bind(e),this.handshake.sendRequest(this.options.version)}flush(){this.interleaving?.flush()}handleMessage(e){let t=this.assembler.receive(e);t&&this.processPacket(t)}processPacket(e){let{marker:t,tick:n,payload:a}=e;switch(t){case l.HandshakeResponse:this.handshake.handleResponse(a),this.handshake.getState()===d.Authenticating&&this.handshake.sendAuth(this.options.username,this.options.token??"");break;case l.HandshakeStateServer:this.handshake.handleServerState(a);break;case l.Ping:this.sendPong(a);break;case l.Pong:this.t>0&&(this.n=Date.now()-this.t,this.t=0);break;case l.UpdateReliable:case l.UpdateReliableFrag:this.currentTick=n,this.callbacks.onUpdate?.(n,a,!0);break;case l.UpdateVolatile:case l.UpdateVolatileFrag:case l.EmptyUpdate:this.currentTick=n,this.callbacks.onUpdate?.(n,a,!1);break;case l.LoadBundle:case l.LoadBundleFrag:this.callbacks.onLoadBundle?.(n,a);break;case l.BridgeToClient:case l.BridgeToClientFrag:this.callbacks.onBridgeMessage?.(a);break}}sendInput(e,t=!1){if(!this.interleaving)return;let n=t?l.InputReliable:l.InputVolatile;this.interleaving.enqueueImmediate(n,this.currentTick,e)}sendPing(){this.interleaving&&(this.t=Date.now(),this.interleaving.enqueueImmediate(l.Ping,this.currentTick,new Uint8Array(0)))}sendPong(e){this.interleaving&&this.interleaving.enqueueImmediate(l.Pong,this.currentTick,e)}sendBridgeMessage(e){this.interleaving&&this.interleaving.enqueue(l.BridgeToServer,this.currentTick,e)}sendClientCallback(e){!this.interleaving||e.byteLength===0||this.interleaving.enqueue(l.ClientCallback,this.currentTick,e)}getRtt(){return this.n}getHandshakeState(){return this.handshake.getState()}getServerConfig(){return this.handshake.getServerConfig()}getCurrentTick(){return this.currentTick}sendLoadingProgress(e){this.handshake.sendLoadingProgress(e)}sendReady(){this.handshake.sendReady()}disconnect(e){this.transport?.close(1e3,e),this.assembler.destroy()}isInSimulation(){return this.handshake.isComplete()}},q=$.create("network:ws-client"),We=class{socket=null;e=h.Closed;onMessage=null;onStateChange=null;onError=null;async connect(e){return new Promise((t,n)=>{try{this.socket=new WebSocket(e),this.socket.binaryType="arraybuffer",this.e=h.Connecting,this.onStateChange?.(h.Connecting),this.socket.onopen=()=>{this.e=h.Open,this.onStateChange?.(h.Open),t()},this.socket.onmessage=a=>{this.onMessage&&a.data instanceof ArrayBuffer&&(q.trace(()=>`onmessage size=${a.data.byteLength}, readyState=${this.socket?.readyState}`),this.onMessage(new Uint8Array(a.data)))},this.socket.onerror=()=>{q.warn("WebSocket error fired");let a=new Error("WebSocket error");this.onError?.(a),this.e===h.Connecting&&n(a)},this.socket.onclose=a=>{q.info("Connection closed",{code:a.code,reason:a.reason,wasClean:a.wasClean}),this.e=h.Closed,this.onStateChange?.(h.Closed)}}catch(a){this.e=h.Closed,n(a)}})}send(e,t){!this.socket||this.socket.readyState!==WebSocket.OPEN||this.socket.send(e)}close(e,t){this.socket&&(this.e=h.Closing,this.onStateChange?.(h.Closing),this.socket.close(e,t))}getState(){return this.e}getBufferedAmount(){return this.socket?.bufferedAmount??0}isReady(){return this.e===h.Open}},Ve=class{constructor(e={mode:"full"}){this.config=e}signalingWs=null;pc=null;reliableDc=null;unreliableDc=null;e=h.Closed;onMessage=null;onStateChange=null;onError=null;async connect(e){let t=e??this.config.signalingUrl;if(!t)throw new Error("WebRTCClient.connect(): no URL provided and config.signalingUrl is not set");return new Promise((n,a)=>{this.e=h.Connecting,this.onStateChange?.(h.Connecting);try{this.signalingWs=new WebSocket(t)}catch(g){this.e=h.Closed,a(g);return}let r=!1,s=!1,i=!1,o=()=>{r&&s&&!i&&(i=!0,this.e=h.Open,this.onStateChange?.(h.Open),n())},c=g=>{i||(i=!0,this.teardown(),a(g))};this.signalingWs.onopen=async()=>{try{let g={};this.config.mode==="full"&&this.config.stunServers?.length&&(g.iceServers=this.config.stunServers.map(f=>({urls:f}))),this.pc=new RTCPeerConnection(g),this.reliableDc=this.pc.createDataChannel(H,{ordered:!0}),this.reliableDc.binaryType="arraybuffer",this.unreliableDc=this.pc.createDataChannel(W,{ordered:!1,maxRetransmits:0}),this.unreliableDc.binaryType="arraybuffer",this.reliableDc.onopen=()=>{r=!0,o()},this.unreliableDc.onopen=()=>{s=!0,o()};let u=f=>{this.onMessage&&f.data instanceof ArrayBuffer&&this.onMessage(new Uint8Array(f.data))};this.reliableDc.onmessage=u,this.unreliableDc.onmessage=u;let U=()=>{this.e===h.Open&&(this.e=h.Closed,this.onStateChange?.(h.Closed))};this.reliableDc.onclose=U,this.unreliableDc.onclose=U,this.reliableDc.onerror=()=>this.onError?.(new Error("Reliable DC error")),this.unreliableDc.onerror=()=>this.onError?.(new Error("Unreliable DC error")),this.pc.onicecandidate=f=>{f.candidate&&this.sendSignaling({type:"rtc-candidate",candidate:f.candidate.candidate,mid:f.candidate.sdpMid??"0"})},this.pc.onconnectionstatechange=()=>{let f=this.pc?.connectionState;(f==="failed"||f==="disconnected")&&c(new Error(`WebRTC connection ${f}`))};let R=await this.pc.createOffer();await this.pc.setLocalDescription(R),this.sendSignaling({type:"rtc-offer",sdp:R.sdp})}catch(g){c(g)}},this.signalingWs.onmessage=async g=>{if(typeof g.data=="string")try{let u=JSON.parse(g.data);switch(u.type){case"rtc-answer":await this.pc.setRemoteDescription({type:"answer",sdp:u.sdp});break;case"rtc-candidate":await this.pc.addIceCandidate({candidate:u.candidate,sdpMid:u.mid});break;case"rtc-error":c(new Error(`Server signaling error: ${u.message}`));break}}catch(u){c(u)}},this.signalingWs.onerror=()=>{c(new Error("Signaling WebSocket error"))},this.signalingWs.onclose=()=>{i?this.e===h.Open&&(this.e=h.Closed,this.onStateChange?.(h.Closed),this.teardown()):c(new Error("Signaling WebSocket closed before WebRTC established"))}})}send(e,t){let n=t?this.reliableDc:this.unreliableDc;if(!n||n.readyState!=="open")return;let a=e.buffer;e.byteOffset===0&&e.byteLength===a.byteLength?n.send(a):n.send(e.slice().buffer)}close(e,t){this.e=h.Closing,this.onStateChange?.(h.Closing),this.teardown(e,t)}getState(){return this.e}getBufferedAmount(){let e=this.reliableDc?.bufferedAmount??0,t=this.unreliableDc?.bufferedAmount??0;return e+t}isReady(){return this.e===h.Open}sendSignaling(e){this.signalingWs&&this.signalingWs.readyState===WebSocket.OPEN&&this.signalingWs.send(JSON.stringify(e))}teardown(e,t){try{this.reliableDc?.close()}catch{}try{this.unreliableDc?.close()}catch{}try{this.pc?.close()}catch{}try{this.signalingWs?.close(e??1e3,t)}catch{}this.reliableDc=null,this.unreliableDc=null,this.pc=null,this.signalingWs=null,this.e=h.Closed}};
|
package/dist/network.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var Se=9,ve=13,Ie=1200,l={HandshakeRequest:1,HandshakeResponse:2,HandshakeStateClient:3,HandshakeStateServer:4,Ping:5,Pong:6,LoadBundle:16,LoadBundleFrag:17,UpdateReliable:32,UpdateReliableFrag:33,UpdateVolatile:34,UpdateVolatileFrag:35,EmptyUpdate:36,InputReliable:48,InputReliableFrag:49,InputVolatile:50,InputVolatileFrag:51,AudioOrder:64,HapticOrder:65,PostProcessOrder:66,MacroOrder:67,BridgeToServer:80,BridgeToServerFrag:81,BridgeToClient:82,BridgeToClientFrag:83,ClientCallback:96,ClientCallbackFrag:97};function x(e){return e===l.LoadBundleFrag||e===l.UpdateReliableFrag||e===l.UpdateVolatileFrag||e===l.InputReliableFrag||e===l.InputVolatileFrag||e===l.BridgeToServerFrag||e===l.BridgeToClientFrag||e===l.ClientCallbackFrag}function ae(e){switch(e){case l.LoadBundle:return l.LoadBundleFrag;case l.UpdateReliable:return l.UpdateReliableFrag;case l.UpdateVolatile:return l.UpdateVolatileFrag;case l.InputReliable:return l.InputReliableFrag;case l.InputVolatile:return l.InputVolatileFrag;case l.BridgeToServer:return l.BridgeToServerFrag;case l.BridgeToClient:return l.BridgeToClientFrag;case l.ClientCallback:return l.ClientCallbackFrag;default:return e}}function M(e){return e<=15||e===l.LoadBundle||e===l.LoadBundleFrag||e===l.UpdateReliable||e===l.UpdateReliableFrag||e===l.InputReliable||e===l.InputReliableFrag||e>=80}var p=(e=>(e[e.OK=0]="OK",e[e.VersionMismatch=1]="VersionMismatch",e[e.ServerFull=2]="ServerFull",e[e.AuthFailed=3]="AuthFailed",e))(p||{}),d=(e=>(e[e.Connected=0]="Connected",e[e.WaitingForResponse=1]="WaitingForResponse",e[e.Authenticating=2]="Authenticating",e[e.LoadingAssets=3]="LoadingAssets",e[e.Ready=4]="Ready",e[e.InSimulation=5]="InSimulation",e[e.Disconnected=255]="Disconnected",e))(d||{}),b=class y{high;low;constructor(t,n){this.high=t>>>0,this.low=n>>>0}static ZERO=new y(0,0);static from(t){let n=Number(t>>32n&0xffffffffn),a=Number(t&0xffffffffn);return new y(n,a)}static fromNumber(t){if(t<0)throw new Error("Tick must be positive");let n=Math.floor(t/4294967296),a=t>>>0;return new y(n,a)}static fromBuffer(t,n=0){let a=(t[n]<<24|t[n+1]<<16|t[n+2]<<8|t[n+3])>>>0,r=(t[n+4]<<24|t[n+5]<<16|t[n+6]<<8|t[n+7])>>>0;return new y(a,r)}toBigInt(){return BigInt(this.high)<<32n|BigInt(this.low)}toNumber(){return this.high*4294967296+this.low}toBuffer(){let t=new Uint8Array(8);return this.writeToBuffer(t,0),t}writeToBuffer(t,n=0){t[n]=this.high>>>24&255,t[n+1]=this.high>>>16&255,t[n+2]=this.high>>>8&255,t[n+3]=this.high&255,t[n+4]=this.low>>>24&255,t[n+5]=this.low>>>16&255,t[n+6]=this.low>>>8&255,t[n+7]=this.low&255}increment(){let t=this.low+1,n=this.high;return t>4294967295&&(t=0,n++),new y(n,t)}compare(t){return this.high!==t.high?this.high-t.high:this.low-t.low}equals(t){return this.high===t.high&&this.low===t.low}isZero(){return this.high===0&&this.low===0}toString(){return`Tick(${this.toBigInt()})`}getHigh(){return this.high}getLow(){return this.low}};function Ae(e){let t=e.fragInfo!==void 0?13:9,n=new Uint8Array(t);return P(e,n,0),n}function P(e,t,n){let a=e.fragInfo!==void 0;return t[n]=e.marker,a&&e.fragInfo?(t[n+1]=e.fragInfo.totalChunks>>>8&255,t[n+2]=e.fragInfo.totalChunks&255,t[n+3]=e.fragInfo.chunkIndex>>>8&255,t[n+4]=e.fragInfo.chunkIndex&255,e.tick.writeToBuffer(t,n+5),13):(e.tick.writeToBuffer(t,n+1),9)}function H(e){if(e.length<9)throw new Error(`Buffer too small for header: ${e.length} < 9`);let t=e[0];if(x(t)){if(e.length<13)throw new Error(`Buffer too small for frag header: ${e.length} < 13`);let a=e[1]<<8|e[2],r=e[3]<<8|e[4],s=b.fromBuffer(e,5);return{header:{marker:t,tick:s,fragInfo:{totalChunks:a,chunkIndex:r}},payloadOffset:13}}let n=b.fromBuffer(e,1);return{header:{marker:t,tick:n},payloadOffset:9}}function I(e,t){let n=e.fragInfo!==void 0?13:9,a=t?t.length:0,r=new Uint8Array(n+a);return P(e,r,0),a>0&&r.set(t,n),r}function Ue(e){let{header:t,payloadOffset:n}=H(e),a=e.slice(n);return{header:t,payload:a}}function O(e,t,n,a){let r=a?.mtu??1200,s=r-13;if(n.length+9<=r)return[I({marker:e,tick:t},n)];let i=ae(e);if(i===e)throw new Error(`Packet with marker 0x${e.toString(16)} exceeds MTU (${r}) but has no fragmentation variant.`);let o=Math.ceil(n.length/s),c=[];for(let g=0;g<o;g++){let u=g*s,U=Math.min(u+s,n.length),R=n.subarray(u,U),f={marker:i,tick:t,fragInfo:{totalChunks:o,chunkIndex:g}};c.push(I(f,R))}return c}function Re(e,t=1200){if(e+9<=t)return 1;let n=t-13;return Math.ceil(e/n)}function Te(e,t=1200){return e+9>t}function se(e,t){return`${e}:${t.getHigh()}:${t.getLow()}`}var W=class{buckets=new Map;ttlMs;constructor(e){this.ttlMs=e?.ttlMs??1e4}receive(e){let{header:t,payloadOffset:n}=H(e),a=e.subarray(n);return!x(t.marker)||!t.fragInfo?{marker:t.marker,tick:t.tick,payload:a}:this.handleFragment(t,a)}handleFragment(e,t){let{marker:n,tick:a,fragInfo:r}=e;if(!r)return null;let s=se(n,a),i=this.buckets.get(s);if(i||(i={marker:n,tick:a,totalChunks:r.totalChunks,receivedCount:0,chunks:new Array(r.totalChunks).fill(null),createdAt:Date.now()},this.buckets.set(s,i)),r.chunkIndex>=i.totalChunks)return null;if(i.chunks[r.chunkIndex]===null&&(i.chunks[r.chunkIndex]=t,i.receivedCount++),i.receivedCount===i.totalChunks){let o=0;for(let u=0;u<i.chunks.length;u++)i.chunks[u]&&(o+=i.chunks[u].length);let c=new Uint8Array(o),g=0;for(let u of i.chunks)u&&(c.set(u,g),g+=u.length);return this.buckets.delete(s),{marker:n,tick:a,payload:c}}return null}cleanup(){let e=Date.now(),t=0;for(let[n,a]of this.buckets)e-a.createdAt>this.ttlMs&&(this.buckets.delete(n),t++);return t}getPendingCount(){return this.buckets.size}clearTick(e){for(let[t,n]of this.buckets)n.tick.equals(e)&&this.buckets.delete(t)}destroy(){this.buckets.clear()}},V=class{transport;backgroundQueue=[];immediateQueue=[];bgCursor=0;imCursor=0;options;constructor(e,t={}){this.transport=e,this.options={fragmentsPerTick:t.fragmentsPerTick??5,bufferedThreshold:t.bufferedThreshold??16384}}enqueue(e,t,n){let a=M(e),r=O(e,t,n);for(let s of r)this.backgroundQueue.push({data:s,reliable:a})}enqueueImmediate(e,t,n){let a=M(e),r=O(e,t,n);for(let s of r)this.immediateQueue.push({data:s,reliable:a})}enqueueRawImmediate(e,t){this.immediateQueue.push({data:e,reliable:t})}flush(){if(!this.transport.isReady())return;for(;this.imCursor<this.immediateQueue.length;){let n=this.immediateQueue[this.imCursor++];this.transport.send(n.data,n.reliable)}this.imCursor>0&&(this.immediateQueue.length=0,this.imCursor=0);let e=0,t=this.options.fragmentsPerTick;for(;this.bgCursor<this.backgroundQueue.length&&e<t&&this.transport.getBufferedAmount()<this.options.bufferedThreshold;){let n=this.backgroundQueue[this.bgCursor++];this.transport.send(n.data,n.reliable),e++}this.bgCursor>0&&this.bgCursor>=this.backgroundQueue.length?(this.backgroundQueue.length=0,this.bgCursor=0):this.bgCursor>256&&(this.backgroundQueue.splice(0,this.bgCursor),this.bgCursor=0)}clear(){this.backgroundQueue.length=0,this.immediateQueue.length=0,this.bgCursor=0,this.imCursor=0}getPendingCount(){return this.backgroundQueue.length-this.bgCursor}hasImmediatePending(){return this.imCursor<this.immediateQueue.length}},w={AudioAck:1,MacroFeedback:2},Q=1,q=2,N=3,Z=4,j=5,C=new TextEncoder,S=new TextDecoder;function Le(e){let t=[];if(e.audioAcks.length>0&&t.push({type:w.AudioAck,payload:re(e.audioAcks)}),e.macroFeedbacks.length>0&&t.push({type:w.MacroFeedback,payload:ie(e.macroFeedbacks)}),t.length===0)return new Uint8Array(0);let n=1;for(let s of t)n+=2+s.payload.byteLength;let a=new Uint8Array(n),r=0;a[r++]=t.length;for(let s of t)a[r++]=s.type,s.type===w.AudioAck?a[r++]=e.audioAcks.length:s.type===w.MacroFeedback?a[r++]=e.macroFeedbacks.length:a[r++]=0,a.set(s.payload,r),r+=s.payload.byteLength;return a}function re(e){let t=0,n=[];for(let i of e)switch(i.type){case"sound-loaded":{let o=C.encode(i.name);n.push({name:o}),t+=4+o.byteLength;break}case"sound-error":{let o=C.encode(i.name),c=C.encode(i.error);n.push({name:o,error:c}),t+=4+o.byteLength+1+c.byteLength;break}case"playback-started":n.push({}),t+=7;break;case"playback-ended":n.push({}),t+=7;break;case"playback-error":{let o=C.encode(i.error);n.push({error:o}),t+=2+(i.instanceId!=null?4:0)+2+1+o.byteLength;break}}let a=new Uint8Array(t),r=new DataView(a.buffer),s=0;for(let i=0;i<e.length;i++){let o=e[i],c=n[i];switch(o.type){case"sound-loaded":a[s++]=Q,r.setUint16(s,o.soundId,!1),s+=2,a[s++]=c.name.byteLength,a.set(c.name,s),s+=c.name.byteLength;break;case"sound-error":a[s++]=q,r.setUint16(s,o.soundId,!1),s+=2,a[s++]=c.name.byteLength,a.set(c.name,s),s+=c.name.byteLength,a[s++]=c.error.byteLength,a.set(c.error,s),s+=c.error.byteLength;break;case"playback-started":a[s++]=N,r.setUint32(s,o.instanceId,!1),s+=4,r.setUint16(s,o.soundId,!1),s+=2;break;case"playback-ended":a[s++]=Z,r.setUint32(s,o.instanceId,!1),s+=4,r.setUint16(s,o.soundId,!1),s+=2;break;case"playback-error":{a[s++]=j;let g=o.instanceId!=null?1:0;a[s++]=g,g&&(r.setUint32(s,o.instanceId,!1),s+=4);let u=typeof o.sound=="number"?o.sound:0;r.setUint16(s,u,!1),s+=2,a[s++]=c.error.byteLength,a.set(c.error,s),s+=c.error.byteLength;break}}}return a}function ie(e){let t=0,n=[];for(let i of e)switch(t+=3,i.cmd){case 1:n.push(null);break;case 2:n.push(null),t+=1+(i.valueType==="number"?2:1);break;case 3:{let o=C.encode(i.text);n.push(o),t+=2+o.byteLength;break}case 4:n.push(null),t+=2;break;case 5:{let o=C.encode(i.data);n.push(o),t+=2+o.byteLength;break}}let a=new Uint8Array(t),r=new DataView(a.buffer),s=0;for(let i=0;i<e.length;i++){let o=e[i];switch(a[s++]=o.cmd,r.setUint16(s,o.instanceId,!1),s+=2,o.cmd){case 1:break;case 2:o.valueType==="number"?(a[s++]=0,r.setUint16(s,o.value,!1),s+=2):(a[s++]=1,a[s++]=o.value?1:0);break;case 3:{let c=n[i];r.setUint16(s,c.byteLength,!1),s+=2,a.set(c,s),s+=c.byteLength;break}case 4:r.setUint16(s,o.index,!1),s+=2;break;case 5:{let c=n[i];r.setUint16(s,c.byteLength,!1),s+=2,a.set(c,s),s+=c.byteLength;break}}}return a}function Ee(e){let t={audioAcks:[],macroFeedbacks:[]};if(e.byteLength===0)return t;let n=new DataView(e.buffer,e.byteOffset,e.byteLength),a=0,r=e[a++];for(let s=0;s<r;s++){let i=e[a++],o=e[a++];switch(i){case w.AudioAck:for(let c=0;c<o;c++){let{ack:g,newOffset:u}=oe(e,n,a);t.audioAcks.push(g),a=u}break;case w.MacroFeedback:for(let c=0;c<o;c++){let{feedback:g,newOffset:u}=le(e,n,a);t.macroFeedbacks.push(g),a=u}break;default:break}}return t}function oe(e,t,n){let a=e[n++];switch(a){case Q:{let r=t.getUint16(n,!1);n+=2;let s=e[n++],i=S.decode(e.subarray(n,n+s));return n+=s,{ack:{type:"sound-loaded",soundId:r,name:i},newOffset:n}}case q:{let r=t.getUint16(n,!1);n+=2;let s=e[n++],i=S.decode(e.subarray(n,n+s));n+=s;let o=e[n++],c=S.decode(e.subarray(n,n+o));return n+=o,{ack:{type:"sound-error",soundId:r,name:i,error:c},newOffset:n}}case N:{let r=t.getUint32(n,!1);n+=4;let s=t.getUint16(n,!1);return n+=2,{ack:{type:"playback-started",instanceId:r,soundId:s},newOffset:n}}case Z:{let r=t.getUint32(n,!1);n+=4;let s=t.getUint16(n,!1);return n+=2,{ack:{type:"playback-ended",instanceId:r,soundId:s},newOffset:n}}case j:{let r=e[n++],s=r?t.getUint32(n,!1):void 0;r&&(n+=4);let i=t.getUint16(n,!1);n+=2;let o=e[n++],c=S.decode(e.subarray(n,n+o));return n+=o,{ack:{type:"playback-error",instanceId:s,sound:i,error:c},newOffset:n}}default:throw new Error(`Unknown AudioAck sub-type: 0x${a.toString(16)}`)}}function le(e,t,n){let a=e[n++],r=t.getUint16(n,!1);switch(n+=2,a){case 1:return{feedback:{cmd:1,instanceId:r},newOffset:n};case 2:{let s=e[n++]===0?"number":"boolean",i;return s==="number"?(i=t.getUint16(n,!1),n+=2):i=e[n++]!==0,{feedback:{cmd:2,instanceId:r,valueType:s,value:i},newOffset:n}}case 3:{let s=t.getUint16(n,!1);n+=2;let i=S.decode(e.subarray(n,n+s));return n+=s,{feedback:{cmd:3,instanceId:r,text:i},newOffset:n}}case 4:{let s=t.getUint16(n,!1);return n+=2,{feedback:{cmd:4,instanceId:r,index:s},newOffset:n}}case 5:{let s=t.getUint16(n,!1);n+=2;let i=S.decode(e.subarray(n,n+s));return n+=s,{feedback:{cmd:5,instanceId:r,data:i},newOffset:n}}default:throw new Error(`Unknown MacroFeedback cmd: 0x${a.toString(16)}`)}}var h=(e=>(e[e.Connecting=0]="Connecting",e[e.Open=1]="Open",e[e.Closing=2]="Closing",e[e.Closed=3]="Closed",e))(h||{}),$e=class{onMessage=null;onStateChange=null;onError=null;send(e,t){this.onMessage?.(e)}getState(){return 1}getBufferedAmount(){return 0}isReady(){return!0}close(e,t){}},K="reliable",z="unreliable";var T={trace:0,debug:1,info:2,warn:3,error:4,silent:5},k=[],F="info",E=new Map,m=new Map,ce=typeof performance<"u"&&typeof performance.now=="function"?()=>performance.now():()=>Date.now(),L=null;function X(e){let t=null,n=-1;for(let[a,r]of E)if(he(a,e)){let s=a.length;s>n&&(n=s,t=r)}return t??F}function he(e,t){if(e==="*")return!0;if(e.endsWith(":*")){let n=e.slice(0,-1);return t===e.slice(0,-2)||t.startsWith(n)}return e===t}function G(){for(let[e,t]of m)t.c(X(e))}var $=class v{namespace;r;i;s;constructor(t,n,a){this.namespace=t,this.i=n,this.s=a,this.r=T[X(t)]}static create(t){let n=m.get(t);return n||(n=new v(t),m.set(t,n)),n}child(t){return v.create(`${this.namespace}:${t}`)}forClient(t,n){let a=`${this.namespace}:client:${t}`,r=m.get(a);return r?(r.i=t,r.s=n):(r=new v(a,t,n),m.set(a,r)),r}static dispose(t){m.delete(t)}trace(t,n){this.n("trace",t,n)}debug(t,n){this.n("debug",t,n)}info(t,n){this.n("info",t,n)}warn(t,n){this.n("warn",t,n)}error(t,n){this.n("error",t,n)}isEnabled(t){return T[t]>=this.r}c(t){this.r=T[t]}n(t,n,a){if(T[t]<this.r||k.length===0)return;let r=typeof n=="function"?n():n,s={timestamp:ce(),level:t,namespace:this.namespace,message:r};L!==null&&(s.tick=L()),a!==void 0&&(s.data=a),this.i!==void 0&&(s.clientId=this.i),this.s!==void 0&&(s.username=this.s);for(let i=0;i<k.length;i++)k[i](s)}static setLevel(t,n){n===void 0?F=t:E.set(t,n),G()}static clearLevelOverrides(){E.clear(),G()}static enable(t){v.setLevel(t,"trace")}static disable(t){v.setLevel(t,"silent")}static addHandler(t){return k.push(t),()=>{let n=k.indexOf(t);n!==-1&&k.splice(n,1)}}static clearHandlers(){k.length=0}static get handlerCount(){return k.length}static setTickProvider(t){L=t}static reset(){k.length=0,E.clear(),m.clear(),F="info",L=null}},A="\x1B[0m",de={trace:"\x1B[90m",debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m"},ue="\x1B[35m",J="\x1B[2m",ge="\x1B[93m",fe={trace:"color:#888",debug:"color:#0cc",info:"color:#0a0",warn:"color:#cc0",error:"color:#c00;font-weight:bold"},ke="color:#c0c;font-weight:bold",Y="color:#888",be="color:#c90;font-weight:bold",_={trace:"debug",debug:"debug",info:"info",warn:"warn",error:"error"},pe=typeof globalThis<"u"&&typeof globalThis.process=="object"&&typeof globalThis.process?.versions=="object";function B(e,t){return String(e).padStart(t,"0")}function ee(e){let t=Math.floor(e/1e3)%60,n=Math.floor(e/6e4)%60,a=Math.floor(e%1e3);return`${B(n,2)}:${B(t,2)}.${B(a,3)}`}function te(e){return e.toUpperCase().padEnd(5)}function ne(e){if(e.clientId===void 0)return"";let t=e.username?`/${e.username}`:"";return` [client:${e.clientId}${t}]`}function me(e){let t=`${J}${ee(e.timestamp)}${A}`,n=e.tick!==void 0?` ${ge}#${e.tick}${A}`:"",a=`${de[e.level]}${te(e.level)}${A}`,r=`${ue}${e.namespace}${A}`,s=e.clientId!==void 0?`${J}${ne(e)}${A}`:"",i=_[e.level],o=`${t}${n} ${a} ${r}${s}`;e.data!==void 0?console[i](o,e.message,e.data):console[i](o,e.message)}function ye(e){let t=_[e.level],n=ne(e),a=e.tick!==void 0?` %c#${e.tick}`:"",r=e.tick!==void 0?[be]:[],s=`%c${ee(e.timestamp)}${a} %c${te(e.level)} %c${e.namespace}%c${n} %c${e.message}`,i=[Y,...r,fe[e.level],ke,Y,""];e.data!==void 0?console[t](s,...i,e.data):console[t](s,...i)}var we=pe?me:ye;$.handlerCount===0&&$.addHandler(we);var Ce=class{state=d.Connected;transport=null;serverConfig=null;callbacks;constructor(e={}){this.callbacks=e}bind(e){this.transport=e}getState(){return this.state}getServerConfig(){return this.serverConfig}sendRequest(e){if(!this.transport)throw new Error("Transport not bound");if(this.state!==d.Connected){this.callbacks.onError?.(`Cannot send HandshakeRequest in state ${this.state}`);return}let t=new Uint8Array(3);t[0]=e.major,t[1]=e.minor,t[2]=e.patch;let n={marker:l.HandshakeRequest,tick:b.ZERO};this.transport.send(I(n,t),!0),this.setState(d.WaitingForResponse)}sendAuth(e,t){if(!this.transport)throw new Error("Transport not bound");if(this.state!==d.Authenticating){this.callbacks.onError?.(`Cannot send Auth in state ${this.state}`);return}let n=new TextEncoder().encode(e),a=new TextEncoder().encode(t),r=new Uint8Array(2+n.length+a.length);r[0]=n.length,r.set(n,1),r[1+n.length]=a.length,r.set(a,2+n.length),this.sendState(d.Authenticating,r)}sendLoadingProgress(e){if(this.state!==d.LoadingAssets)return;let t=new Uint8Array([Math.min(100,Math.max(0,e))]);this.sendState(d.LoadingAssets,t)}sendReady(){if(this.state!==d.LoadingAssets){this.callbacks.onError?.(`Cannot send Ready in state ${this.state}`);return}this.sendState(d.Ready)}handleResponse(e){if(this.state!==d.WaitingForResponse){this.callbacks.onError?.(`Unexpected HandshakeResponse in state ${this.state}`);return}if(e.length<14){this.callbacks.onError?.("Invalid HandshakeResponse: too short");return}let t=e[0],n=e[1],a=e[2],r=b.fromBuffer(e,3),s=e[11]<<8|e[12],i=e[13];if(this.serverConfig={status:t,serverVersion:{major:n,minor:a},startTick:r,clientId:s,tickRate:i},this.callbacks.onServerConfig?.(this.serverConfig),t!==p.OK){let o={[p.OK]:"",[p.VersionMismatch]:"Version mismatch",[p.ServerFull]:"Server full",[p.AuthFailed]:"Authentication failed"};this.callbacks.onError?.(o[t]||"Unknown error"),this.setState(d.Disconnected);return}this.setState(d.Authenticating)}handleServerState(e){if(e.length<1)return;let t=e[0];switch(t){case d.LoadingAssets:if(this.state!==d.Authenticating){this.callbacks.onError?.(`Unexpected LoadingAssets from server in state ${this.state}`);return}this.setState(d.LoadingAssets);break;case d.Ready:if(this.state!==d.LoadingAssets){this.callbacks.onError?.(`Unexpected Ready from server in state ${this.state}`);return}this.setState(d.Ready);break;case d.InSimulation:if(this.state!==d.Ready&&this.state!==d.LoadingAssets){this.callbacks.onError?.(`Unexpected InSimulation from server in state ${this.state}`);return}this.setState(d.InSimulation),this.callbacks.onReady?.();break;case d.Disconnected:if(e.length>2){let n=e[1],a=new TextDecoder().decode(e.slice(2,2+n));this.callbacks.onError?.(a)}this.setState(d.Disconnected);break;default:this.callbacks.onError?.(`Unknown server state: 0x${t.toString(16)}`);break}}sendState(e,t){if(!this.transport)throw new Error("Transport not bound");let n=new Uint8Array(1+(t?.length??0));n[0]=e,t&&n.set(t,1);let a={marker:l.HandshakeStateClient,tick:b.ZERO};this.transport.send(I(a,n),!0)}setState(e){this.state=e,this.callbacks.onStateChange?.(e)}isComplete(){return this.state===d.InSimulation}},He=class{transport=null;assembler;interleaving=null;handshake;callbacks;options;currentTick=b.ZERO;t=0;n=0;constructor(e,t={}){this.options=e,this.callbacks=t,this.assembler=new W,this.handshake=new Ce({onStateChange:n=>this.callbacks.onHandshakeState?.(n),onServerConfig:n=>{this.currentTick=n.startTick,this.callbacks.onServerConfig?.(n)},onError:n=>this.callbacks.onError?.(n),onReady:()=>this.callbacks.onSimulationStart?.()})}async connect(e,t){this.transport=e,this.interleaving=new V(e),e.onMessage=n=>this.handleMessage(n),e.onStateChange=n=>{n===h.Closed&&this.callbacks.onDisconnect?.("Transport closed")},e.onError=n=>this.callbacks.onError?.(n.message),await e.connect(t),this.handshake.bind(e),this.handshake.sendRequest(this.options.version)}flush(){this.interleaving?.flush()}handleMessage(e){let t=this.assembler.receive(e);t&&this.processPacket(t)}processPacket(e){let{marker:t,tick:n,payload:a}=e;switch(t){case l.HandshakeResponse:this.handshake.handleResponse(a),this.handshake.getState()===d.Authenticating&&this.handshake.sendAuth(this.options.username,this.options.token??"");break;case l.HandshakeStateServer:this.handshake.handleServerState(a);break;case l.Ping:this.sendPong(a);break;case l.Pong:this.t>0&&(this.n=Date.now()-this.t,this.t=0);break;case l.UpdateReliable:case l.UpdateReliableFrag:this.currentTick=n,this.callbacks.onUpdate?.(n,a,!0);break;case l.UpdateVolatile:case l.UpdateVolatileFrag:case l.EmptyUpdate:this.currentTick=n,this.callbacks.onUpdate?.(n,a,!1);break;case l.LoadBundle:case l.LoadBundleFrag:this.callbacks.onLoadBundle?.(n,a);break;case l.BridgeToClient:case l.BridgeToClientFrag:this.callbacks.onBridgeMessage?.(a);break}}sendInput(e,t=!1){if(!this.interleaving)return;let n=t?l.InputReliable:l.InputVolatile;this.interleaving.enqueueImmediate(n,this.currentTick,e)}sendPing(){this.interleaving&&(this.t=Date.now(),this.interleaving.enqueueImmediate(l.Ping,this.currentTick,new Uint8Array(0)))}sendPong(e){this.interleaving&&this.interleaving.enqueueImmediate(l.Pong,this.currentTick,e)}sendBridgeMessage(e){this.interleaving&&this.interleaving.enqueue(l.BridgeToServer,this.currentTick,e)}sendClientCallback(e){!this.interleaving||e.byteLength===0||this.interleaving.enqueue(l.ClientCallback,this.currentTick,e)}getRtt(){return this.n}getHandshakeState(){return this.handshake.getState()}getServerConfig(){return this.handshake.getServerConfig()}getCurrentTick(){return this.currentTick}sendLoadingProgress(e){this.handshake.sendLoadingProgress(e)}sendReady(){this.handshake.sendReady()}disconnect(e){this.transport?.close(1e3,e),this.assembler.destroy()}isInSimulation(){return this.handshake.isComplete()}},D=$.create("network:ws-client"),Qe=class{socket=null;e=h.Closed;onMessage=null;onStateChange=null;onError=null;async connect(e){return new Promise((t,n)=>{try{this.socket=new WebSocket(e),this.socket.binaryType="arraybuffer",this.e=h.Connecting,this.onStateChange?.(h.Connecting),this.socket.onopen=()=>{this.e=h.Open,this.onStateChange?.(h.Open),t()},this.socket.onmessage=a=>{this.onMessage&&a.data instanceof ArrayBuffer&&(D.trace(()=>`onmessage size=${a.data.byteLength}, readyState=${this.socket?.readyState}`),this.onMessage(new Uint8Array(a.data)))},this.socket.onerror=()=>{D.warn("WebSocket error fired");let a=new Error("WebSocket error");this.onError?.(a),this.e===h.Connecting&&n(a)},this.socket.onclose=a=>{D.info("Connection closed",{code:a.code,reason:a.reason,wasClean:a.wasClean}),this.e=h.Closed,this.onStateChange?.(h.Closed)}}catch(a){this.e=h.Closed,n(a)}})}send(e,t){!this.socket||this.socket.readyState!==WebSocket.OPEN||this.socket.send(e)}close(e,t){this.socket&&(this.e=h.Closing,this.onStateChange?.(h.Closing),this.socket.close(e,t))}getState(){return this.e}getBufferedAmount(){return this.socket?.bufferedAmount??0}isReady(){return this.e===h.Open}},Ze=class{constructor(e={mode:"full"}){this.config=e}signalingWs=null;pc=null;reliableDc=null;unreliableDc=null;e=h.Closed;onMessage=null;onStateChange=null;onError=null;async connect(e){let t=e??this.config.signalingUrl;if(!t)throw new Error("WebRTCClient.connect(): no URL provided and config.signalingUrl is not set");return new Promise((n,a)=>{this.e=h.Connecting,this.onStateChange?.(h.Connecting);try{this.signalingWs=new WebSocket(t)}catch(g){this.e=h.Closed,a(g);return}let r=!1,s=!1,i=!1,o=()=>{r&&s&&!i&&(i=!0,this.e=h.Open,this.onStateChange?.(h.Open),n())},c=g=>{i||(i=!0,this.teardown(),a(g))};this.signalingWs.onopen=async()=>{try{let g={};this.config.mode==="full"&&this.config.stunServers?.length&&(g.iceServers=this.config.stunServers.map(f=>({urls:f}))),this.pc=new RTCPeerConnection(g),this.reliableDc=this.pc.createDataChannel(K,{ordered:!0}),this.reliableDc.binaryType="arraybuffer",this.unreliableDc=this.pc.createDataChannel(z,{ordered:!1,maxRetransmits:0}),this.unreliableDc.binaryType="arraybuffer",this.reliableDc.onopen=()=>{r=!0,o()},this.unreliableDc.onopen=()=>{s=!0,o()};let u=f=>{this.onMessage&&f.data instanceof ArrayBuffer&&this.onMessage(new Uint8Array(f.data))};this.reliableDc.onmessage=u,this.unreliableDc.onmessage=u;let U=()=>{this.e===h.Open&&(this.e=h.Closed,this.onStateChange?.(h.Closed))};this.reliableDc.onclose=U,this.unreliableDc.onclose=U,this.reliableDc.onerror=()=>this.onError?.(new Error("Reliable DC error")),this.unreliableDc.onerror=()=>this.onError?.(new Error("Unreliable DC error")),this.pc.onicecandidate=f=>{f.candidate&&this.sendSignaling({type:"rtc-candidate",candidate:f.candidate.candidate,mid:f.candidate.sdpMid??"0"})},this.pc.onconnectionstatechange=()=>{let f=this.pc?.connectionState;(f==="failed"||f==="disconnected")&&c(new Error(`WebRTC connection ${f}`))};let R=await this.pc.createOffer();await this.pc.setLocalDescription(R),this.sendSignaling({type:"rtc-offer",sdp:R.sdp})}catch(g){c(g)}},this.signalingWs.onmessage=async g=>{if(typeof g.data=="string")try{let u=JSON.parse(g.data);switch(u.type){case"rtc-answer":await this.pc.setRemoteDescription({type:"answer",sdp:u.sdp});break;case"rtc-candidate":await this.pc.addIceCandidate({candidate:u.candidate,sdpMid:u.mid});break;case"rtc-error":c(new Error(`Server signaling error: ${u.message}`));break}}catch(u){c(u)}},this.signalingWs.onerror=()=>{c(new Error("Signaling WebSocket error"))},this.signalingWs.onclose=()=>{i?this.e===h.Open&&(this.e=h.Closed,this.onStateChange?.(h.Closed),this.teardown()):c(new Error("Signaling WebSocket closed before WebRTC established"))}})}send(e,t){let n=t?this.reliableDc:this.unreliableDc;if(!n||n.readyState!=="open")return;let a=e.buffer;e.byteOffset===0&&e.byteLength===a.byteLength?n.send(a):n.send(e.slice().buffer)}close(e,t){this.e=h.Closing,this.onStateChange?.(h.Closing),this.teardown(e,t)}getState(){return this.e}getBufferedAmount(){let e=this.reliableDc?.bufferedAmount??0,t=this.unreliableDc?.bufferedAmount??0;return e+t}isReady(){return this.e===h.Open}sendSignaling(e){this.signalingWs&&this.signalingWs.readyState===WebSocket.OPEN&&this.signalingWs.send(JSON.stringify(e))}teardown(e,t){try{this.reliableDc?.close()}catch{}try{this.unreliableDc?.close()}catch{}try{this.pc?.close()}catch{}try{this.signalingWs?.close(e??1e3,t)}catch{}this.reliableDc=null,this.unreliableDc=null,this.pc=null,this.signalingWs=null,this.e=h.Closed}};export{w as CallbackSectionType,K as DC_RELIABLE,z as DC_UNRELIABLE,W as FragmentAssembler,ve as HEADER_SIZE_FRAG,Se as HEADER_SIZE_SINGLE,Ce as HandshakeClient,d as HandshakeState,p as HandshakeStatus,V as InterleavingManager,$e as LoopbackTransport,Ie as MTU,l as Marker,He as NetworkClient,b as Tick,h as TransportState,Qe as UWebSocketClient,Ze as WebRTCClient,Re as calculateFragmentCount,I as createPacket,Ee as decodeClientCallback,H as decodeHeader,Le as encodeClientCallback,Ae as encodeHeader,Ue as extractPayload,O as fragmentPacket,x as isFragMarker,M as isReliableMarker,ae as toFragMarker,Te as willFragment};
|