diff --git a/src/jlmap3d/config/SetCamera.js b/src/jlmap3d/config/SetCamera.js index 14c8570f4..f9037c07f 100644 --- a/src/jlmap3d/config/SetCamera.js +++ b/src/jlmap3d/config/SetCamera.js @@ -1,5 +1,5 @@ export function SetCamera(dom) { - var camera = new THREE.PerspectiveCamera(60, dom.clientWidth/dom.clientHeight, 1, 1500); + var camera = new THREE.PerspectiveCamera(60, dom.clientWidth/dom.clientHeight, 1, 5000); camera.position.set( 0, 0, 0 ); camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); diff --git a/src/jlmap3d/edit/editmodel/TrainList.js b/src/jlmap3d/edit/editmodel/TrainList.js index 67466cc22..3900cd120 100644 --- a/src/jlmap3d/edit/editmodel/TrainList.js +++ b/src/jlmap3d/edit/editmodel/TrainList.js @@ -20,34 +20,34 @@ export function TrainList() { THREE.Loader.Handlers.add( /\.dds$/i, new THREE.DDSLoader() ) ; for(let i=0;i=0; i--) { - mixers[i].update( delta ); - } + // stats.update(); } @@ -254,7 +249,13 @@ export function JLmapDriving(dom,data,mapId,storemod,translation,routegroup) { scope.webwork.onmessage = function (event) { // 更新列车位置 UpdateTrain(camera, trainlisttest); - + delta = clock.getDelta(); + for (let i=mixers.length-1; i>=0; i--) { + mixers[i].update( delta ); + } + if(scope.cctvswitch == true){ + renderercctv.render(scene,cameracctv); + } }; } diff --git a/src/jlmap3d/jl3ddrive/moveupdate/DrivingConnect.js b/src/jlmap3d/jl3ddrive/moveupdate/DrivingConnect.js index b763d80bc..2253611cd 100644 --- a/src/jlmap3d/jl3ddrive/moveupdate/DrivingConnect.js +++ b/src/jlmap3d/jl3ddrive/moveupdate/DrivingConnect.js @@ -7,7 +7,7 @@ import { getToken } from '@/utils/auth'; import router from '@/router'; // 定于仿真socket接口 -export function Jl3dDriving(updatemmi,sound,translation,routegroup) { +export function Jl3dDriving(mixers,updatemmi,sound,translation,routegroup) { let scope = this; this.map = null; @@ -35,7 +35,6 @@ export function Jl3dDriving(updatemmi,sound,translation,routegroup) { let stoptimer = null; let num = 30; let pointstand = null; - let nextpoints = null; // run as plane = 01; // reset = 02; var datatype = '00'; @@ -101,9 +100,6 @@ export function Jl3dDriving(updatemmi,sound,translation,routegroup) { // // } - // console.log("recive"); - // console.log(data.type); - // console.log(data.body); switch (data.type) { case 'Simulation_Driver_Change': trainlisttest.group.remove(trainlisttest.list[drivingcode]); @@ -191,7 +187,6 @@ export function Jl3dDriving(updatemmi,sound,translation,routegroup) { // if(sound.volswitch == true){ // sound.setVolume( data.body[tl].v/100 ); // } - if (data.body[tl].atpv) { updatemmi.updateatpspeed(data.body[tl].atpv); } else { @@ -341,14 +336,19 @@ export function Jl3dDriving(updatemmi,sound,translation,routegroup) { drivingcode = code; updatemmi.updatedrivingcode(drivingcode); } - // trainlisttest.group.add(trainlisttest.list[code]); + if(trainlisttest.list[code].mixerpush == false){ + for(let mi=0,lenmi=trainlisttest.list[code].mixer.length;mi=0; i--) { - if (data.body[i]._type == 'Train') { + function trainstatus(data){ + // for (let i=data.body.length-1; i>=0; i--) { + // console.log(data.body[i]); - // console.log(data.body[i]); - // 遍历列车对象组 - if (trainlisttest) { - code = data.body[i].code; - // 剔除不显示的车 - // 找到对应列车 + // console.log(data.body[i]); + // 遍历列车对象组 + if (trainlisttest) { + code = data.code; + // 剔除不显示的车 + // 找到对应列车 - if ( trainlisttest.list[code]) { - if (code == drivingcode) { - driverswitch = data.body[i].runMode; - //更新车组号 - jlmap3d.updatetrainnum(data.body[i].groupNumber); - //更新列车 - let syncdata = { - type: 'Train', - code: code, - sectionCode: data.body[i].sectionCode, - percent: 0 - }; - // if (trainlisttest.list[code].isStandTrack == true && trainlisttest.list[code].progress>0.95 && trainlisttest.list[code].speed<=0) { - // if (data.body[i].directionType == '02') { - // syncdata.percent = 1-(sectionlist.sections.datalist[data.body[i].sectionCode].rstop/trainlisttest.list[code].len); - // } else { - // syncdata.percent = sectionlist.sections.datalist[data.body[i].sectionCode].lstop/trainlisttest.list[code].len; - // } - // scope.teststomp.send('/app/topic/simulation/client/drive', syncdata); - // } else { - // if (data.body[i].directionType == '02') { - // syncdata.percent = trainlisttest.list[code].progress; - // } else { - // syncdata.percent = 1 - trainlisttest.list[code].progress; - // } - // scope.teststomp.send('/app/topic/simulation/client/drive', syncdata); - // } + if ( trainlisttest.list[code]) { - if (data.body[i].parkRemainTime>0) { - jlmap3d.updatestoptime('停站时间:'+parseInt(data.body[i].parkRemainTime)); - } else { - if (data.body[i].runMode == '02') { - jlmap3d.updatestoptime('列车自动驾驶中'); - } else { - // if (trainlisttest.list[code].isStandTrack == true && trainlisttest.list[code].progress>0.95 && trainlisttest.list[code].speed<=0) { - // // if(stoptimer){ - // // - // // }else{ - // // stoptimer = setInterval(function(){ - // // if(num >=0){ - // // jlmap3d.updatestoptime("停站时间:"+num); - // // num --; - // // } - // // },1000); - // // } - // - // } else { - // jlmap3d.updatestoptime('列车人工驾驶中'); - // } + trainlisttest.list[code].runMode = data.runMode; + // 车门开关验证 + // if(data.directionType == "02"){ + if (trainlisttest.list[code].doorStatus != data.doorStatus && data.doorStatus == '01') { + // console.log("close"); + trainlisttest.list[code].doorStatus = '01'; + for (let an=actions[code].top.length-1; an>=0; an--) { + actions[code].top[an].reset(); + actions[code].top[an].time = actions[code].top[an]._clip.duration; + actions[code].top[an].timeScale = -1; + actions[code].top[an].play(); + } + } else if (trainlisttest.list[code].doorStatus != data.doorStatus && data.doorStatus == '02') { + // console.log("open"); + trainlisttest.list[code].doorStatus = '02'; + for (let an=actions[code].top.length-1; an>=0; an--) { + actions[code].top[an].reset(); + actions[code].top[an].time = 0; + actions[code].top[an].timeScale = 1; + actions[code].top[an].play(); + } + } + // }else{ + // if(trainlisttest.list[code].doorStatus != data.doorStatus && data.doorStatus == "01"){ + // //console.log("close"); + // trainlisttest.list[code].doorStatus = "01"; + // for(let an=actions[code].down.length-1;an>=0;an--){ + // actions[code].down[an].reset(); + // actions[code].down[an].time = actions[code].top[an]._clip.duration; + // actions[code].down[an].timeScale = -1; + // actions[code].down[an].play(); + // } + // }else if(trainlisttest.list[code].doorStatus != data.doorStatus && data.doorStatus == "02"){ + // //console.log("open"); + // trainlisttest.list[code].doorStatus = "02"; + // for(let an=actions[code].down.length-1;an>=0;an--){ + // actions[code].down[an].reset(); + // actions[code].down[an].time = 0; + // actions[code].down[an].timeScale = 1; + // actions[code].down[an].play(); + // } + // } + // } + // 遍历获取所在轨道 + if (trainlisttest.list[code].dispose != data.dispose && data.dispose == false) { + if (rails.linkrail[data.linkCode]) { + trainlisttest.group.add(trainlisttest.list[code]); + trainlisttest.list[code].position.y = 0; + // trainlisttest.list[code].progress = 0; + trainlisttest.list[code].dispose = false; + trainlisttest.list[code].nowcode = data.linkCode; + trainlisttest.list[code].nextcode = null; + trainlisttest.list[code].pc = 1; + trainlisttest.list[code].statsstop = 0; + if(trainlisttest.list[code].mixerpush == false){ + for(let mi=0,lenmi=trainlisttest.list[code].mixer.length;mi 0){ - // if(stoptimer){ - // clearInterval( stoptimer ); - // stoptimer = null; - // num = 30; - // } - // } - } - trainlisttest.list[code].runMode = data.body[i].runMode; - // 车门开关验证 - // if(data.body[i].directionType == "02"){ - if (trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == '01') { - // console.log("close"); - trainlisttest.list[code].doorStatus = '01'; - for (let an=actions[code].top.length-1; an>=0; an--) { - actions[code].top[an].reset(); - actions[code].top[an].time = actions[code].top[an]._clip.duration; - actions[code].top[an].timeScale = -1; - actions[code].top[an].play(); - } - } else if (trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == '02') { - // console.log("open"); - trainlisttest.list[code].doorStatus = '02'; - for (let an=actions[code].top.length-1; an>=0; an--) { - actions[code].top[an].reset(); - actions[code].top[an].time = 0; - actions[code].top[an].timeScale = 1; - actions[code].top[an].play(); - } - } - // }else{ - // if(trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == "01"){ - // //console.log("close"); - // trainlisttest.list[code].doorStatus = "01"; - // for(let an=actions[code].down.length-1;an>=0;an--){ - // actions[code].down[an].reset(); - // actions[code].down[an].time = actions[code].top[an]._clip.duration; - // actions[code].down[an].timeScale = -1; - // actions[code].down[an].play(); - // } - // }else if(trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == "02"){ - // //console.log("open"); - // trainlisttest.list[code].doorStatus = "02"; - // for(let an=actions[code].down.length-1;an>=0;an--){ - // actions[code].down[an].reset(); - // actions[code].down[an].time = 0; - // actions[code].down[an].timeScale = 1; - // actions[code].down[an].play(); - // } - // } - // } - // 遍历获取所在轨道 - if (trainlisttest.list[code].dispose != data.body[i].dispose && data.body[i].dispose == false) { - if (rails.linkrail[data.body[i].linkCode]) { - trainlisttest.group.add(trainlisttest.list[code]); - trainlisttest.list[code].position.y = 0; - trainlisttest.list[code].progress = 0; - trainlisttest.list[code].oldoffset = data.body[i].linkOffsetPercent; - trainlisttest.list[code].dispose = false; - trainlisttest.list[code].nowcode = data.body[i].linkCode; - trainlisttest.list[code].nextcode = rails.linkrail[data.body[i].linkCode].next; - let vexlist = []; + if (data.directionType == '02') { // 向右 - if (data.body[i].directionType == '02') { // 向右 - let point = rails.linkrail[data.body[i].linkCode].lineleft.getPointAt(data.body[i].linkOffsetPercent); + + if(data.targetStation){ + trainlisttest.list[code].stopstation = data.targetStation; + // console.log(rails.stops[data.targetStation].direct2.percent); + trainlisttest.list[code].pc = data.targetLinkPercent/rails.stops[data.targetStation].direct2.percent; + trainlisttest.list[code].targetpercent = rails.stops[data.targetStation].direct2.percent; + trainlisttest.list[code].progress = data.linkOffsetPercent/trainlisttest.list[code].pc; + trainlisttest.list[code].linkOffsetPercent = data.linkOffsetPercent; + trainlisttest.list[code].targetLink = data.targetLink; + // console.log(data.targetLinkPercent); + // console.log(rails.stops[data.targetStation].direct2.percent); + // console.log(trainlisttest.list[code].progress); + // console.log("==================="); + let point = rails.linkrail[data.linkCode].lineleft.getPointAt(trainlisttest.list[code].progress); trainlisttest.list[code].rotation.y = 0; trainlisttest.list[code].position.x = point.x; trainlisttest.list[code].position.y = 0; @@ -279,193 +344,210 @@ export function Jlmap3dSubscribe(jlmap3d,routegroup) { trainlisttest.list[code].children[tl].position.z = point.z; } - trainlisttest.list[code].status = '02'; - trainlisttest.list[code].progress = data.body[i].linkOffsetPercent; - trainlisttest.list[code].curve = rails.linkrail[data.body[i].linkCode].lineleft; - } else if (data.body[i].directionType == '03') { // 向左 - let point = rails.linkrail[data.body[i].linkCode].lineright.getPointAt((1-data.body[i].linkOffsetPercent)); + } + + trainlisttest.list[code].curve = rails.linkrail[data.linkCode].lineleft; + trainlisttest.list[code].len = rails.linkrail[data.linkCode].lengthfact; + trainlisttest.list[code].status = '02'; + } else if (data.directionType == '03') { // 向左 + + // if(trainlisttest.list[code].rname == "006"){ + // console.log("0000000000000000"); + // console.log(data.linkOffsetPercent); + // } + if(data.targetStation){ + + trainlisttest.list[code].stopstation = data.targetStation; + trainlisttest.list[code].pc = data.targetLinkPercent/rails.stops[data.targetStation].direct1.percent; + trainlisttest.list[code].targetpercent = rails.stops[data.targetStation].direct1.percent; + trainlisttest.list[code].progress = 1-(data.linkOffsetPercent/trainlisttest.list[code].pc); + trainlisttest.list[code].linkOffsetPercent = data.linkOffsetPercent; + trainlisttest.list[code].targetLink = data.targetLink; + // console.log(data.targetLinkPercent); + // console.log(rails.stops[data.targetStation].direct1.percent); + // console.log(trainlisttest.list[code].progress); + // console.log("==================="); + let point = rails.linkrail[data.linkCode].lineright.getPointAt(trainlisttest.list[code].progress); + trainlisttest.list[code].rotation.y = Math.PI; trainlisttest.list[code].position.x = point.x; trainlisttest.list[code].position.y = 0; for (let tl=0; tl<6; tl++) { trainlisttest.list[code].children[tl].position.z = -point.z; } - // if(trainlisttest.list[code].rname == "006"){ - // console.log("0000000000000000"); - // console.log(data.body[i].linkOffsetPercent); - // } - - trainlisttest.list[code].status = '03'; - trainlisttest.list[code].progress = 1-data.body[i].linkOffsetPercent; - trainlisttest.list[code].curve = rails.linkrail[data.body[i].linkCode].lineright; } + trainlisttest.list[code].curve = rails.linkrail[data.linkCode].lineright; + trainlisttest.list[code].len = rails.linkrail[data.linkCode].lengthfact; + trainlisttest.list[code].status = '03'; - trainlisttest.list[code].len = rails.linkrail[data.body[i].linkCode].lengthfact; - // trainlisttest.list[code].isStandTrack = sectionlist.sections.datalist[data.body[i].sectionCode].isStandTrack; - - // trainlisttest.list[code].len = sectionlist.sections.datalist[data.body[i].sectionCode].distance; - - - if(data.body[i].speed == 0){ - trainlisttest.list[code].speeds = data.body[i].speed; - trainlisttest.list[code].speeds = 0; - // trainlisttest.list[code].startmark = 1; - }else{ - trainlisttest.list[code].speeds = data.body[i].speed; - trainlisttest.list[code].speeds = parseFloat(data.body[i].speed*10/36/20/trainlisttest.list[code].len); - } - + // trainlisttest.list[code].curve = rails.linkrail[data.linkCode].lineright; } - } else if (trainlisttest.list[code].dispose != data.body[i].dispose && data.body[i].dispose == true) { - trainlisttest.group.remove(trainlisttest.list[code]); - trainlisttest.list[code].progress = null; - trainlisttest.list[code].dispose = true; - code = trainlisttest.group.children[i].name; + + + trainlisttest.list[code].len = rails.linkrail[data.linkCode].lengthfact; + // trainlisttest.list[code].isStandTrack = sectionlist.sections.datalist[data.sectionCode].isStandTrack; + + // trainlisttest.list[code].len = sectionlist.sections.datalist[data.sectionCode].distance; + + + if(data.speed == 0){ + trainlisttest.list[code].speeds = data.speed; + trainlisttest.list[code].speeds = 0; + // trainlisttest.list[code].startmark = 1; + }else{ + trainlisttest.list[code].speeds = data.speed; + trainlisttest.list[code].speeds = parseFloat(data.speed*10/36/20/trainlisttest.list[code].len); + } + + } + } else if (trainlisttest.list[code].dispose != data.dispose && data.dispose == true) { + trainlisttest.group.remove(trainlisttest.list[code]); + trainlisttest.list[code].progress = null; + trainlisttest.list[code].dispose = true; + code = trainlisttest.group.children[i].name; + trainlisttest.list[code].rotation.y = 0; + trainlisttest.list[code].doorStatus = '01'; + trainlisttest.list[code].speed = 0; + trainlisttest.list[code].position.x = -50000; + trainlisttest.list[code].position.y = -50000; + trainlisttest.list[code].pc = 1; + + } else if (trainlisttest.list[code].dispose == data.dispose && data.dispose == false) { + + // if(data.){ + // + // } + if (data.directionType == '02' && trainlisttest.list[code].status != data.directionType) { // 向右 + + + let rotaposx = trainlisttest.list[code].children[5].matrixWorld.elements[12]; + let rotaposz = trainlisttest.list[code].children[0].matrixWorld.elements[14]; trainlisttest.list[code].rotation.y = 0; - trainlisttest.list[code].doorStatus = '01'; - trainlisttest.list[code].speed = 0; - trainlisttest.list[code].position.x = -50000; - trainlisttest.list[code].position.y = -50000; + trainlisttest.list[code].position.x = rotaposx; + for (let tl=0; tl<6; tl++) { + trainlisttest.list[code].children[tl].position.z = rotaposz; + } - } else if (trainlisttest.list[code].dispose == data.body[i].dispose && data.body[i].dispose == false) { + trainlisttest.list[code].progress = (rotaposx-rails.linkrail[data.linkCode].lp.x)/rails.linkrail[data.linkCode].lengthfact; + trainlisttest.list[code].status = '02'; + trainlisttest.list[code].curve = rails.linkrail[data.linkCode].lineleft; + trainlisttest.list[code].nextcurve = null; - if (rails.linkrail[data.body[i].linkCode]) { - if (driverswitch == '02' && code == drivingcode) { - jlmap3d.updatenowspeed(data.body[i].speed); - if (data.body[i].atpSpeed) { - jlmap3d.updateatpspeed(data.body[i].atpSpeed); - } else { - jlmap3d.updateatpspeed(-1); - } - if (data.body[i].targetSpeed) { - jlmap3d.updateatospeed(data.body[i].targetSpeed); - } else { - jlmap3d.updateatospeed(-1); - } - if (data.body[i].maLen) { - jlmap3d.updatenowlen(data.body[i].maLen); - } else { - jlmap3d.updatenowlen(0); - } - // if(trainlisttest.list[code].isStandTrack == true){ - // pointstand = null; - // if(data.body[i].directionType == "02"){ - // pointstand = trainlisttest.list[code].curve.getPointAt(data.body[i].sectionOffsetPercent); - // }else{ - // pointstand = trainlisttest.list[code].curve.getPointAt(1-data.body[i].sectionOffsetPercent); - // } - // console.log(data.body[i].sectionOffsetPercent) - // console.log(pointstand.x); - // - // trainlisttest.list[code].position.x = pointstand.x; - // } - } - if (driverswitch == '05' && code == drivingcode) { - if (data.body[i].maLen) { - jlmap3d.updatenowlen(data.body[i].maLen); - } else { - jlmap3d.updatenowlen(0); - } - } - if(trainlisttest.list[code].nowcode != data.body[i].linkCode){ - trainlisttest.list[code].nowcode = data.body[i].linkCode; - trainlisttest.list[code].nextcode = rails.linkrail[data.body[i].linkCode].next; - if (data.body[i].directionType == '02') { // 向右 - trainlisttest.list[code].progress = 0; - if (trainlisttest.list[code].status != data.body[i].directionType) { - const rotaposx = trainlisttest.list[code].children[5].matrixWorld.elements[12]; - const rotaposz = trainlisttest.list[code].children[0].matrixWorld.elements[14]; - trainlisttest.list[code].rotation.y = 0; - trainlisttest.list[code].position.x = rotaposx; - for (let tl=0; tl<6; tl++) { - trainlisttest.list[code].children[tl].position.z = rotaposz; - } + trainlisttest.list[code].len = rails.linkrail[data.linkCode].lengthfact; - trainlisttest.list[code].progress = (rotaposx-rails.linkrail[data.body[i].linkCode].lp.x)/rails.linkrail[data.body[i].linkCode].lengthfact; - } - trainlisttest.list[code].status = '02'; - trainlisttest.list[code].curve = rails.linkrail[data.body[i].linkCode].lineleft; - } else if (data.body[i].directionType == '03') { // 向左 - trainlisttest.list[code].progress = 0; - if (trainlisttest.list[code].status != data.body[i].directionType) { - const rotaposx = trainlisttest.list[code].children[5].matrixWorld.elements[12]; - const rotaposz = Math.abs(trainlisttest.list[code].children[0].matrixWorld.elements[14]); - trainlisttest.list[code].rotation.y = Math.PI; - trainlisttest.list[code].position.x = rotaposx; - for (let tl=0; tl<6; tl++) { - trainlisttest.list[code].children[tl].position.z = -rotaposz; - } - trainlisttest.list[code].progress = 1-(rotaposx-rails.linkrail[data.body[i].linkCode].lp.x)/rails.linkrail[data.body[i].linkCode].lengthfact; - } + } else if (data.directionType == '03'&& trainlisttest.list[code].status != data.directionType) { // 向左 - trainlisttest.list[code].status = '03'; - trainlisttest.list[code].curve = rails.linkrail[data.body[i].linkCode].lineright; + let rotaposx = trainlisttest.list[code].children[5].matrixWorld.elements[12]; + let rotaposz = Math.abs(trainlisttest.list[code].children[0].matrixWorld.elements[14]); + trainlisttest.list[code].rotation.y = Math.PI; + trainlisttest.list[code].position.x = rotaposx; + for (let tl=0; tl<6; tl++) { + trainlisttest.list[code].children[tl].position.z = -rotaposz; + } + trainlisttest.list[code].progress = 1-(rotaposx-rails.linkrail[data.linkCode].lp.x)/rails.linkrail[data.linkCode].lengthfact; + trainlisttest.list[code].status = '03'; + trainlisttest.list[code].curve = rails.linkrail[data.linkCode].lineright; + trainlisttest.list[code].nextcurve = null; + + trainlisttest.list[code].len = rails.linkrail[data.linkCode].lengthfact; + + } + + + if(trainlisttest.list[code].nextcode == null && trainlisttest.list[code].stopstation == data.targetStation){ + // if(data.groupNumber == "013"){ + // console.log(trainlisttest.list[code].nextcode); + // console.log(trainlisttest.list[code].stopstation); + // console.log(data.targetStation); + // console.log(data.body[i]); + // console.log(trainlisttest.list[code]); + // } + if(trainlisttest.list[code].targetLink != trainlisttest.list[code].nowlink){ + let nextcode; + if(data.directionType == '02'){ + + trainlisttest.list[code].status = '02'; + // console.log(rails.linkrail[trainlisttest.list[code].nowcode]); + + if(rails.linkrail[trainlisttest.list[code].nowcode]){ + nextcode = rails.linkrail[trainlisttest.list[code].nowcode].rconnect; } - - - // console.log(rails.linkrail[data.body[i].linkCode]); - // console.log(data.body[i].linkCode) - // console.log(nextcode); - - - trainlisttest.list[code].len = rails.linkrail[data.body[i].linkCode].lengthfact; - } - - - if(data.body[i].directionType == '02'){ - let nextcode = rails.linkrail[data.body[i].linkCode].rconnect; - if(nextcode){ - trainlisttest.list[code].nextcurve = rails.linkrail[nextcode].lineright; - } - - }else if(data.body[i].directionType == '03'){ - let nextcode = rails.linkrail[data.body[i].linkCode].lconnect; if(nextcode){ trainlisttest.list[code].nextcurve = rails.linkrail[nextcode].lineleft; - } + trainlisttest.list[code].nextlen = rails.linkrail[nextcode].lengthfact; + }else{ - } + trainlisttest.list[code].nextlen = 0; + } + }else if(data.directionType == '03'){ + + trainlisttest.list[code].status = '03'; + if(rails.linkrail[trainlisttest.list[code].nowcode]){ + nextcode = rails.linkrail[trainlisttest.list[code].nowcode].lconnect; + } + if(nextcode){ + trainlisttest.list[code].nextcurve = rails.linkrail[nextcode].lineright; + trainlisttest.list[code].nextlen = rails.linkrail[nextcode].lengthfact; + }else{ + + trainlisttest.list[code].nextlen = 0; + } + } + trainlisttest.list[code].nextcode = nextcode; + + } + + if(trainlisttest.list[code].curve == null){ + trainlisttest.list[code].len = trainlisttest.list[code].nextlen; + trainlisttest.list[code].nowcode = trainlisttest.list[code].nextcode; + trainlisttest.list[code].curve = trainlisttest.list[code].nextcurve; + trainlisttest.list[code].nextcurve = null; + trainlisttest.list[code].nextlen = null; + trainlisttest.list[code].nextcode = null; } } + + if(trainlisttest.list[code].stopstation != data.targetStation){ + + if(data.directionType == '02'){ + if(data.targetStation){ + trainlisttest.list[code].pc = data.targetLinkPercent/rails.stops[data.targetStation].direct2.percent; + trainlisttest.list[code].targetpercent = rails.stops[data.targetStation].direct2.percent; + trainlisttest.list[code].linkOffsetPercent = data.linkOffsetPercent; + trainlisttest.list[code].targetLink = data.targetLink; + } + + + trainlisttest.list[code].status = '02'; + }else if(data.directionType == '03'){ + if(data.targetStation){ + trainlisttest.list[code].pc = data.targetLinkPercent/rails.stops[data.targetStation].direct1.percent; + trainlisttest.list[code].targetpercent = rails.stops[data.targetStation].direct1.percent; + trainlisttest.list[code].linkOffsetPercent = data.linkOffsetPercent; + trainlisttest.list[code].targetLink = data.targetLink; + } + + trainlisttest.list[code].status = '03'; + + } + trainlisttest.list[code].statsstop = 0; + trainlisttest.list[code].stopstation = data.targetStation; + + } + + } } - } - } - } - - if (data.type == 'Simulation_DeviceStatus') { - // console.log(data.body); - for (let i= 0,leni = data.body.length; i= 0; i--) { - - if (data.body[i]._type == 'Train') { - - // console.log(data.body[i]); - // 遍历列车对象组 - // console.log(data.body[i]); - if (trainlisttest) { - code = data.body[i].code; - // 剔除不显示的车 - // 找到对应列车 - - if (trainlisttest.list[code]) { - // 车门开关验证 - // if(data.body[i].directionType == "02"){ - if (trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == '01') { - // console.log("close"); - trainlisttest.list[code].doorStatus = '01'; - for (let an = actions[code].top.length - 1; an >= 0; an--) { - actions[code].top[an].reset(); - actions[code].top[an].time = actions[code].top[an]._clip.duration; - actions[code].top[an].timeScale = -1; - actions[code].top[an].play(); - } - } else if (trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == '02') { - // console.log("open"); - trainlisttest.list[code].doorStatus = '02'; - for (let an = actions[code].top.length - 1; an >= 0; an--) { - actions[code].top[an].reset(); - actions[code].top[an].time = 0; - actions[code].top[an].timeScale = 1; - actions[code].top[an].play(); - } - } - // }else{ - // if(trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == "01"){ - // //console.log("close"); - // trainlisttest.list[code].doorStatus = "01"; - // for(let an=actions[code].down.length-1;an>=0;an--){ - // actions[code].down[an].reset(); - // actions[code].down[an].time = actions[code].top[an]._clip.duration; - // actions[code].down[an].timeScale = -1; - // actions[code].down[an].play(); - // } - // }else if(trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == "02"){ - // //console.log("open"); - // trainlisttest.list[code].doorStatus = "02"; - // for(let an=actions[code].down.length-1;an>=0;an--){ - // actions[code].down[an].reset(); - // actions[code].down[an].time = 0; - // actions[code].down[an].timeScale = 1; - // actions[code].down[an].play(); - // } - // } - // } - // 遍历获取所在轨道 - if (trainlisttest.list[code].dispose != data.body[i].dispose && data.body[i].dispose == false) { - trainlisttest.group.add(trainlisttest.list[code]); - - if (sectionlist.sections.datalist[data.body[i].sectionCode].code) { - - trainlisttest.list[code].position.y = 0; - trainlisttest.list[code].progress = 0; - trainlisttest.list[code].oldoffset = data.body[i].sectionOffsetPercent; - trainlisttest.list[code].dispose = false; - - if (data.body[i].directionType == '02') { - trainlisttest.list[code].status = '02'; - trainlisttest.list[code].rotation.y = 0; - } else if (data.body[i].directionType == '03') { - trainlisttest.list[code].status = '03'; - trainlisttest.list[code].rotation.y = Math.PI; - } - - } - - } else if (trainlisttest.list[code].dispose != data.body[i].dispose && data.body[i].dispose == true) { - trainlisttest.group.remove(trainlisttest.list[code]); - trainlisttest.list[code].progress = null; - trainlisttest.list[code].dispose = true; - - } else if (trainlisttest.list[code].dispose == data.body[i].dispose && data.body[i].dispose == false) { - - if (sectionlist.sections.datalist[data.body[i].sectionCode].code) { - if (trainlisttest.list[code].nowcode != data.body[i].sectionCode || trainlisttest.list[code].nextcode != data.body[i].nextSectionCode) { - trainlisttest.list[code].nowcode = data.body[i].sectionCode; - trainlisttest.list[code].nextcode = data.body[i].nextSectionCode; - const vexlist = []; - const endrotation = null; - if (data.body[i].directionType == '02') { // 向右 - if (trainlisttest.list[code].status != data.body[i].directionType) { - console.log(trainlisttest.list[code].position); - console.log(trainlisttest.list[code].children[5].matrixWorld); - trainlisttest.list[code].position.x = trainlisttest.list[code].children[5].matrixWorld.elements[12]; - trainlisttest.list[code].children[0].position.z = trainlisttest.list[code].children[0].matrixWorld.elements[14]; - trainlisttest.list[code].children[1].position.z = trainlisttest.list[code].children[1].matrixWorld.elements[14]; - trainlisttest.list[code].children[2].position.z = trainlisttest.list[code].children[2].matrixWorld.elements[14]; - trainlisttest.list[code].children[3].position.z = trainlisttest.list[code].children[3].matrixWorld.elements[14]; - trainlisttest.list[code].children[4].position.z = trainlisttest.list[code].children[4].matrixWorld.elements[14]; - trainlisttest.list[code].children[5].position.z = trainlisttest.list[code].children[5].matrixWorld.elements[14]; - - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x > sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { - vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); - for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x > trainlisttest.list[code].position.x) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - - } - } else { - vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); - for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x > trainlisttest.list[code].position.x) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - } - } - } else { - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x > sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { - for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - } else { - for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - } - } - trainlisttest.list[code].status = '02'; - trainlisttest.list[code].rotation.y = 0; - - } else if (data.body[i].directionType == '03') { // 向左 - - if (trainlisttest.list[code].status != data.body[i].directionType) { - trainlisttest.list[code].position.x = trainlisttest.list[code].children[5].matrixWorld.elements[12]; - trainlisttest.list[code].children[0].position.z = trainlisttest.list[code].children[0].matrixWorld.elements[14]; - trainlisttest.list[code].children[1].position.z = trainlisttest.list[code].children[1].matrixWorld.elements[14]; - trainlisttest.list[code].children[2].position.z = trainlisttest.list[code].children[2].matrixWorld.elements[14]; - trainlisttest.list[code].children[3].position.z = trainlisttest.list[code].children[3].matrixWorld.elements[14]; - trainlisttest.list[code].children[4].position.z = trainlisttest.list[code].children[4].matrixWorld.elements[14]; - trainlisttest.list[code].children[5].position.z = trainlisttest.list[code].children[5].matrixWorld.elements[14]; - // - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x < sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { - vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); - for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x < trainlisttest.list[code].position.x) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - } - } else { - vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); - for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x < trainlisttest.list[code].position.x) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - } - } - } else { - // - if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x < sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { - for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - - } else { - for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { - vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); - } - } - } - trainlisttest.list[code].status = '03'; - trainlisttest.list[code].rotation.y = Math.PI; - - } - - trainlisttest.list[code].curve = new THREE.CatmullRomCurve3(vexlist); - // console.log(trainlisttest.list[code].curve.points); - // console.log(data.body[i].speed) - // console.log(sectionlist.sections.datalist[data.body[i].sectionCode].distance); - trainlisttest.list[code].speeds = data.body[i].speed * 10 / 36 / 11 / sectionlist.sections.datalist[data.body[i].sectionCode].distance; - - trainlisttest.list[code].progress = 0; - } - // console.log("speed"); - // console.log(data.body[i].speed); - // console.log(trainlisttest.list[code].speed); - if (data.body[i].speed != trainlisttest.list[code].speed) { - trainlisttest.list[code].speed = data.body[i].speed; - trainlisttest.list[code].speeds = data.body[i].speed * 10 / 36 / 11 / sectionlist.sections.datalist[data.body[i].sectionCode].distance; - // if(trainlisttest.list[code].speeds > 0.1){ - // console.log(data.body[i]); - // console.log(data.body[i].speed) - // console.log(sectionlist.sections.datalist[data.body[i].sectionCode].distance); - // console.log(trainlisttest.list[code].speeds); - // } - } - - } - - } - - } - - } - } - - // 0xFFFFFF - // 0xCD0000 红 - // 0xEEEE00 黄 - // 0x32CD32 绿 - if (data.body[i]._type == 'Signal') { - - if (signallist) { - code = data.body[i].code; - if (data.body[i].lightType == '01') { - if (signallist.list[code].mesh.code) { - signallist.list[code].mesh.status = data.body[i].status; - - // 55 - // 33 - // 77 - // 关闭 - if (data.body[i].status == '01') { - signallist.list[code].mesh.children[0].material.map = materials[3]; - signallist.list[code].mesh.children[0].material.map.needsUpdate = true; - signallist.list[code].mesh.children[1].material.map = materials[0]; - signallist.list[code].mesh.children[1].material.map.needsUpdate = true; - signallist.list[code].mesh.children[2].material.map = materials[3]; - signallist.list[code].mesh.children[2].material.map.needsUpdate = true; - - } - // 开放 - if (data.body[i].status == '02') { - - if (data.body[i].switchLocateType == '01') { - signallist.list[code].mesh.children[0].material.map = materials[2]; - signallist.list[code].mesh.children[0].material.map.needsUpdate = true; - signallist.list[code].mesh.children[1].material.map = materials[3]; - signallist.list[code].mesh.children[1].material.map.needsUpdate = true; - signallist.list[code].mesh.children[2].material.map = materials[3]; - signallist.list[code].mesh.children[2].material.map.needsUpdate = true; - - } - - if (data.body[i].switchLocateType == '02') { - signallist.list[code].mesh.children[0].material.map = materials[3]; - signallist.list[code].mesh.children[0].material.map.needsUpdate = true; - signallist.list[code].mesh.children[1].material.map = materials[3]; - signallist.list[code].mesh.children[1].material.map.needsUpdate = true; - signallist.list[code].mesh.children[2].material.map = materials[1]; - signallist.list[code].mesh.children[2].material.map.needsUpdate = true; - - } - - } - // 引导 - if (data.body[i].status == '03') { - signallist.list[code].mesh.children[0].material.map = materials[3]; - signallist.list[code].mesh.children[0].material.map.needsUpdate = true; - signallist.list[code].mesh.children[1].material.map = materials[0]; - signallist.list[code].mesh.children[1].material.map.needsUpdate = true; - signallist.list[code].mesh.children[2].material.map = materials[1]; - signallist.list[code].mesh.children[2].material.map.needsUpdate = true; - - } - // 封锁 - if (data.body[i].status == '04') { - signallist.list[code].mesh.children[0].material.map = materials[3]; - signallist.list[code].mesh.children[0].material.map.needsUpdate = true; - signallist.list[code].mesh.children[1].material.map = materials[3]; - signallist.list[code].mesh.children[1].material.map.needsUpdate = true; - signallist.list[code].mesh.children[2].material.map = materials[3]; - signallist.list[code].mesh.children[2].material.map.needsUpdate = true; - - } - // 故障 - if (data.body[i].status == '05') { - signallist.list[code].mesh.children[0].material.map = materials[3]; - signallist.list[code].mesh.children[0].material.map.needsUpdate = true; - signallist.list[code].mesh.children[1].material.map = materials[3]; - signallist.list[code].mesh.children[1].material.map.needsUpdate = true; - signallist.list[code].mesh.children[2].material.map = materials[3]; - signallist.list[code].mesh.children[2].material.map.needsUpdate = true; - - } - - } - - } else if (data.body[i].lightType == '01') { - if (signallist.list[code].mesh.code) { - signallist.list[code].mesh.children[0].material.map = materials[3]; - signallist.list[code].mesh.children[0].material.map.needsUpdate = true; - signallist.list[code].mesh.children[1].material.map = materials[3]; - signallist.list[code].mesh.children[1].material.map.needsUpdate = true; - signallist.list[code].mesh.children[2].material.map = materials[3]; - signallist.list[code].mesh.children[2].material.map.needsUpdate = true; - - } - - } - - } - - } - - if (data.body[i]._type == 'StationStand') { - if (actions) { - code = data.body[i].code; - if (data.body[i].screenDoorOpenStatus == '02' && actions[code].status == '01') { - actions[code].status = '00'; - } - if (data.body[i].screenDoorOpenStatus == '02' && actions[code].status == '00') { - actions[code].status = '02'; - actions[code].action.reset(); - actions[code].action.time = 0; - actions[code].action.timeScale = 1; - actions[code].action.play(); - } - - if (data.body[i].screenDoorOpenStatus == '01' && actions[code].status == '02') { - actions[code].status = '00'; - } - if (data.body[i].screenDoorOpenStatus == '01' && actions[code].status == '00') { - actions[code].status = '01'; - actions[code].action.reset(); - actions[code].action.time = actions[code].action._clip.duration; - actions[code].action.timeScale = -1; - actions[code].action.play(); - } - - } - - } - - if (data.body[i]._type == 'Switch') { - - if (sectionlist) { - code = data.body[i].code; - for (let j = sectionlist.switchs.modellist.length - 1; j >= 0; j--) { - if (sectionlist.switchs.modellist[j].code == code) { - if (sectionlist.switchs.modellist[j].locateType != data.body[i].locateType) { - if (data.body[i].locateType == '02') { - sectionlist.switchs.modellist[j].locateType = data.body[i].locateType; - actions[sectionlist.switchs.modellist[j].code].reset(); - actions[sectionlist.switchs.modellist[j].code].time = 0; - actions[sectionlist.switchs.modellist[j].code].timeScale = 1; - actions[sectionlist.switchs.modellist[j].code].play(); - - } else if (data.body[i].locateType == '01') { - sectionlist.switchs.modellist[j].locateType = data.body[i].locateType; - actions[sectionlist.switchs.modellist[j].code].reset(); - actions[sectionlist.switchs.modellist[j].code].time = actions[sectionlist.switchs.modellist[j].code]._clip.duration; - actions[sectionlist.switchs.modellist[j].code].timeScale = -1; - actions[sectionlist.switchs.modellist[j].code].play(); - - } - } - - // console.log(sectionlist.group[j].name); - j = 0; - } - } - } - - } - } - - } else if (data.body.length > 200) { - - } - - } - - } + const scope = this; + this.map = null; + + const webworker = worker; + var trainlisttest = null; + var sectionlist = null; + var signallist = null; + var stationstandlist = null; + var sectionlist = null; + var materials = null; + var actions = null; + var scenes = null; + + var code = null; + + this.teststomp = new StompClient(); + this.topic = displayTopic; + const header = { group: router.currentRoute.query.group, 'X-Token': getToken() }; + console.log( router.currentRoute.query.group); + this.updatamap = function (mapdata, materiallist, nowaction, scene) { + // console.log(mapdata); + scope.map = mapdata; + trainlisttest = this.map.trainlisttest; + sectionlist = this.map.sectionlist; + signallist = this.map.signallist; + stationstandlist = this.map.stationstandlist; + sectionlist = this.map.sectionlist; + materials = materiallist; + scenes = scene; + actions = nowaction; + }; + + this.socketon = function (topic) { + try { + // console.log("teststomp"); + scope.teststomp.subscribe(topic, callback, header); + } catch (error) { + console.error('websocket订阅失败'); + } + + }; + + this.socketoff = function (topic) { + scope.teststomp.unsubscribe(topic); + }; + + // 仿真socket接口回调函数 + function callback(Response) { + // 对象化数据 + const data = JSON.parse(Response.body); + // 遍历后台数据 + + // 判断消息类型 + // if(data.type == "Simulation_TrainPosition"){ + // + // + // } + if (data.type == 'Simulation_DeviceStatus') { + + if (data.body.length < 200) { + + for (let i = data.body.length - 1; i >= 0; i--) { + + if (data.body[i]._type == 'Train') { + + // console.log(data.body[i]); + // 遍历列车对象组 + // console.log(data.body[i]); + if (trainlisttest) { + code = data.body[i].code; + // 剔除不显示的车 + // 找到对应列车 + + if (trainlisttest.list[code]) { + // 车门开关验证 + // if(data.body[i].directionType == "02"){ + if (trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == '01') { + // console.log("close"); + trainlisttest.list[code].doorStatus = '01'; + for (let an = actions[code].top.length - 1; an >= 0; an--) { + actions[code].top[an].reset(); + actions[code].top[an].time = actions[code].top[an]._clip.duration; + actions[code].top[an].timeScale = -1; + actions[code].top[an].play(); + } + } else if (trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == '02') { + // console.log("open"); + trainlisttest.list[code].doorStatus = '02'; + for (let an = actions[code].top.length - 1; an >= 0; an--) { + actions[code].top[an].reset(); + actions[code].top[an].time = 0; + actions[code].top[an].timeScale = 1; + actions[code].top[an].play(); + } + } + // }else{ + // if(trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == "01"){ + // //console.log("close"); + // trainlisttest.list[code].doorStatus = "01"; + // for(let an=actions[code].down.length-1;an>=0;an--){ + // actions[code].down[an].reset(); + // actions[code].down[an].time = actions[code].top[an]._clip.duration; + // actions[code].down[an].timeScale = -1; + // actions[code].down[an].play(); + // } + // }else if(trainlisttest.list[code].doorStatus != data.body[i].doorStatus && data.body[i].doorStatus == "02"){ + // //console.log("open"); + // trainlisttest.list[code].doorStatus = "02"; + // for(let an=actions[code].down.length-1;an>=0;an--){ + // actions[code].down[an].reset(); + // actions[code].down[an].time = 0; + // actions[code].down[an].timeScale = 1; + // actions[code].down[an].play(); + // } + // } + // } + // 遍历获取所在轨道 + if (trainlisttest.list[code].dispose != data.body[i].dispose && data.body[i].dispose == false) { + trainlisttest.group.add(trainlisttest.list[code]); + + if (sectionlist.sections.datalist[data.body[i].sectionCode].code) { + + trainlisttest.list[code].position.y = 0; + trainlisttest.list[code].progress = 0; + trainlisttest.list[code].oldoffset = data.body[i].sectionOffsetPercent; + trainlisttest.list[code].dispose = false; + + if (data.body[i].directionType == '02') { + trainlisttest.list[code].status = '02'; + trainlisttest.list[code].rotation.y = 0; + } else if (data.body[i].directionType == '03') { + trainlisttest.list[code].status = '03'; + trainlisttest.list[code].rotation.y = Math.PI; + } + + } + + } else if (trainlisttest.list[code].dispose != data.body[i].dispose && data.body[i].dispose == true) { + trainlisttest.group.remove(trainlisttest.list[code]); + trainlisttest.list[code].progress = null; + trainlisttest.list[code].dispose = true; + + } else if (trainlisttest.list[code].dispose == data.body[i].dispose && data.body[i].dispose == false) { + + if (sectionlist.sections.datalist[data.body[i].sectionCode].code) { + if (trainlisttest.list[code].nowcode != data.body[i].sectionCode || trainlisttest.list[code].nextcode != data.body[i].nextSectionCode) { + trainlisttest.list[code].nowcode = data.body[i].sectionCode; + trainlisttest.list[code].nextcode = data.body[i].nextSectionCode; + const vexlist = []; + const endrotation = null; + if (data.body[i].directionType == '02') { // 向右 + if (trainlisttest.list[code].status != data.body[i].directionType) { + console.log(trainlisttest.list[code].position); + console.log(trainlisttest.list[code].children[5].matrixWorld); + trainlisttest.list[code].position.x = trainlisttest.list[code].children[5].matrixWorld.elements[12]; + trainlisttest.list[code].children[0].position.z = trainlisttest.list[code].children[0].matrixWorld.elements[14]; + trainlisttest.list[code].children[1].position.z = trainlisttest.list[code].children[1].matrixWorld.elements[14]; + trainlisttest.list[code].children[2].position.z = trainlisttest.list[code].children[2].matrixWorld.elements[14]; + trainlisttest.list[code].children[3].position.z = trainlisttest.list[code].children[3].matrixWorld.elements[14]; + trainlisttest.list[code].children[4].position.z = trainlisttest.list[code].children[4].matrixWorld.elements[14]; + trainlisttest.list[code].children[5].position.z = trainlisttest.list[code].children[5].matrixWorld.elements[14]; + + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x > sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { + vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); + for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x > trainlisttest.list[code].position.x) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + + } + } else { + vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); + for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x > trainlisttest.list[code].position.x) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + } + } + } else { + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x > sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { + for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + } else { + for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + } + } + trainlisttest.list[code].status = '02'; + trainlisttest.list[code].rotation.y = 0; + + } else if (data.body[i].directionType == '03') { // 向左 + + if (trainlisttest.list[code].status != data.body[i].directionType) { + trainlisttest.list[code].position.x = trainlisttest.list[code].children[5].matrixWorld.elements[12]; + trainlisttest.list[code].children[0].position.z = trainlisttest.list[code].children[0].matrixWorld.elements[14]; + trainlisttest.list[code].children[1].position.z = trainlisttest.list[code].children[1].matrixWorld.elements[14]; + trainlisttest.list[code].children[2].position.z = trainlisttest.list[code].children[2].matrixWorld.elements[14]; + trainlisttest.list[code].children[3].position.z = trainlisttest.list[code].children[3].matrixWorld.elements[14]; + trainlisttest.list[code].children[4].position.z = trainlisttest.list[code].children[4].matrixWorld.elements[14]; + trainlisttest.list[code].children[5].position.z = trainlisttest.list[code].children[5].matrixWorld.elements[14]; + // + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x < sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { + vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); + for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x < trainlisttest.list[code].position.x) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + } + } else { + vexlist.push(new THREE.Vector3(trainlisttest.list[code].position.x, 0, trainlisttest.list[code].children[0].matrixWorld.elements[14])); + for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[m].x < trainlisttest.list[code].position.x) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + } + } + } else { + // + if (sectionlist.sections.datalist[data.body[i].sectionCode].rail[0].x < sectionlist.sections.datalist[data.body[i].sectionCode].rail[1].x) { + for (let m = sectionlist.sections.datalist[data.body[i].sectionCode].rail.length - 1; m >= 0; m--) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + + } else { + for (let m = 0; m < sectionlist.sections.datalist[data.body[i].sectionCode].rail.length; m++) { + vexlist.push(sectionlist.sections.datalist[data.body[i].sectionCode].rail[m]); + } + } + } + trainlisttest.list[code].status = '03'; + trainlisttest.list[code].rotation.y = Math.PI; + + } + + trainlisttest.list[code].curve = new THREE.CatmullRomCurve3(vexlist); + // console.log(trainlisttest.list[code].curve.points); + // console.log(data.body[i].speed) + // console.log(sectionlist.sections.datalist[data.body[i].sectionCode].distance); + trainlisttest.list[code].speeds = data.body[i].speed * 10 / 36 / 11 / sectionlist.sections.datalist[data.body[i].sectionCode].distance; + + trainlisttest.list[code].progress = 0; + } + // console.log("speed"); + // console.log(data.body[i].speed); + // console.log(trainlisttest.list[code].speed); + if (data.body[i].speed != trainlisttest.list[code].speed) { + trainlisttest.list[code].speed = data.body[i].speed; + trainlisttest.list[code].speeds = data.body[i].speed * 10 / 36 / 11 / sectionlist.sections.datalist[data.body[i].sectionCode].distance; + // if(trainlisttest.list[code].speeds > 0.1){ + // console.log(data.body[i]); + // console.log(data.body[i].speed) + // console.log(sectionlist.sections.datalist[data.body[i].sectionCode].distance); + // console.log(trainlisttest.list[code].speeds); + // } + } + + } + + } + + } + + } + } + + // 0xFFFFFF + // 0xCD0000 红 + // 0xEEEE00 黄 + // 0x32CD32 绿 + if (data.body[i]._type == 'Signal') { + + if (signallist) { + code = data.body[i].code; + if (data.body[i].lightType == '01') { + if (signallist.list[code].mesh.code) { + signallist.list[code].mesh.status = data.body[i].status; + + // 55 + // 33 + // 77 + // 关闭 + if (data.body[i].status == '01') { + signallist.list[code].mesh.children[0].material.map = materials[3]; + signallist.list[code].mesh.children[0].material.map.needsUpdate = true; + signallist.list[code].mesh.children[1].material.map = materials[0]; + signallist.list[code].mesh.children[1].material.map.needsUpdate = true; + signallist.list[code].mesh.children[2].material.map = materials[3]; + signallist.list[code].mesh.children[2].material.map.needsUpdate = true; + + } + // 开放 + if (data.body[i].status == '02') { + + if (data.body[i].switchLocateType == '01') { + signallist.list[code].mesh.children[0].material.map = materials[2]; + signallist.list[code].mesh.children[0].material.map.needsUpdate = true; + signallist.list[code].mesh.children[1].material.map = materials[3]; + signallist.list[code].mesh.children[1].material.map.needsUpdate = true; + signallist.list[code].mesh.children[2].material.map = materials[3]; + signallist.list[code].mesh.children[2].material.map.needsUpdate = true; + + } + + if (data.body[i].switchLocateType == '02') { + signallist.list[code].mesh.children[0].material.map = materials[3]; + signallist.list[code].mesh.children[0].material.map.needsUpdate = true; + signallist.list[code].mesh.children[1].material.map = materials[3]; + signallist.list[code].mesh.children[1].material.map.needsUpdate = true; + signallist.list[code].mesh.children[2].material.map = materials[1]; + signallist.list[code].mesh.children[2].material.map.needsUpdate = true; + + } + + } + // 引导 + if (data.body[i].status == '03') { + signallist.list[code].mesh.children[0].material.map = materials[3]; + signallist.list[code].mesh.children[0].material.map.needsUpdate = true; + signallist.list[code].mesh.children[1].material.map = materials[0]; + signallist.list[code].mesh.children[1].material.map.needsUpdate = true; + signallist.list[code].mesh.children[2].material.map = materials[1]; + signallist.list[code].mesh.children[2].material.map.needsUpdate = true; + + } + // 封锁 + if (data.body[i].status == '04') { + signallist.list[code].mesh.children[0].material.map = materials[3]; + signallist.list[code].mesh.children[0].material.map.needsUpdate = true; + signallist.list[code].mesh.children[1].material.map = materials[3]; + signallist.list[code].mesh.children[1].material.map.needsUpdate = true; + signallist.list[code].mesh.children[2].material.map = materials[3]; + signallist.list[code].mesh.children[2].material.map.needsUpdate = true; + + } + // 故障 + if (data.body[i].status == '05') { + signallist.list[code].mesh.children[0].material.map = materials[3]; + signallist.list[code].mesh.children[0].material.map.needsUpdate = true; + signallist.list[code].mesh.children[1].material.map = materials[3]; + signallist.list[code].mesh.children[1].material.map.needsUpdate = true; + signallist.list[code].mesh.children[2].material.map = materials[3]; + signallist.list[code].mesh.children[2].material.map.needsUpdate = true; + + } + + } + + } else if (data.body[i].lightType == '01') { + if (signallist.list[code].mesh.code) { + signallist.list[code].mesh.children[0].material.map = materials[3]; + signallist.list[code].mesh.children[0].material.map.needsUpdate = true; + signallist.list[code].mesh.children[1].material.map = materials[3]; + signallist.list[code].mesh.children[1].material.map.needsUpdate = true; + signallist.list[code].mesh.children[2].material.map = materials[3]; + signallist.list[code].mesh.children[2].material.map.needsUpdate = true; + + } + + } + + } + + } + + if (data.body[i]._type == 'StationStand') { + if (actions) { + code = data.body[i].code; + if (data.body[i].screenDoorOpenStatus == '02' && actions[code].status == '01') { + actions[code].status = '00'; + } + if (data.body[i].screenDoorOpenStatus == '02' && actions[code].status == '00') { + actions[code].status = '02'; + actions[code].action.reset(); + actions[code].action.time = 0; + actions[code].action.timeScale = 1; + actions[code].action.play(); + } + + if (data.body[i].screenDoorOpenStatus == '01' && actions[code].status == '02') { + actions[code].status = '00'; + } + if (data.body[i].screenDoorOpenStatus == '01' && actions[code].status == '00') { + actions[code].status = '01'; + actions[code].action.reset(); + actions[code].action.time = actions[code].action._clip.duration; + actions[code].action.timeScale = -1; + actions[code].action.play(); + } + + } + + } + + if (data.body[i]._type == 'Switch') { + + if (sectionlist) { + code = data.body[i].code; + for (let j = sectionlist.switchs.modellist.length - 1; j >= 0; j--) { + if (sectionlist.switchs.modellist[j].code == code) { + if (sectionlist.switchs.modellist[j].locateType != data.body[i].locateType) { + if (data.body[i].locateType == '02') { + sectionlist.switchs.modellist[j].locateType = data.body[i].locateType; + actions[sectionlist.switchs.modellist[j].code].reset(); + actions[sectionlist.switchs.modellist[j].code].time = 0; + actions[sectionlist.switchs.modellist[j].code].timeScale = 1; + actions[sectionlist.switchs.modellist[j].code].play(); + + } else if (data.body[i].locateType == '01') { + sectionlist.switchs.modellist[j].locateType = data.body[i].locateType; + actions[sectionlist.switchs.modellist[j].code].reset(); + actions[sectionlist.switchs.modellist[j].code].time = actions[sectionlist.switchs.modellist[j].code]._clip.duration; + actions[sectionlist.switchs.modellist[j].code].timeScale = -1; + actions[sectionlist.switchs.modellist[j].code].play(); + + } + } + + // console.log(sectionlist.group[j].name); + j = 0; + } + } + } + + } + } + + } else if (data.body.length > 200) { + + } + + } + + } + } diff --git a/src/jlmap3d/jl3dsimulation/connect/UpdateTrainTest.js b/src/jlmap3d/jl3dsimulation/connect/UpdateTrainTest.js new file mode 100644 index 000000000..728a5b18a --- /dev/null +++ b/src/jlmap3d/jl3dsimulation/connect/UpdateTrainTest.js @@ -0,0 +1,201 @@ + +export function UpdateTrain(camera,traindata){ + if(traindata != undefined ){ + for(let j=traindata.group.children.length-1;j>=0;j--){ + //判断是否有移动事件 + if(traindata.group.children[j].dispose == false){ + + if(traindata.group.children[j].progress != null){ + + let trainmodel = traindata.group.children[j]; + + if(trainmodel.speeds > 0 && trainmodel.speeds){ + + let speed = null; + if(traindata.group.children[j].progress >=0&&traindata.group.children[j].progress<=1){ + // console.log(trainmodel.rname); + // console.log(trainmodel.speeds); + // console.log(trainmodel.progress); + let movecurve = trainmodel.curve; + if(trainmodel.status == "03" && movecurve.points.length>1){ + let point = movecurve.getPointAt(traindata.group.children[j].progress); + trainmodel.position.x = point.x; + trainmodel.position.y = 0; + if(Math.abs( point.z -trainmodel.children[0].matrixWorld.elements[14]) >0.02){ + trainmodel.children[0].up = new THREE.Vector3(-1,0,0); + let tangent = movecurve.getTangentAt(traindata.group.children[j].progress).normalize(); + trainmodel.children[0].axis.crossVectors(trainmodel.children[0].up, tangent).normalize(); + let radians = Math.acos(trainmodel.children[0].up.dot(tangent)); + + trainmodel.children[0].quaternion.setFromAxisAngle(trainmodel.children[0].axis, radians); + trainmodel.children[0].rotation.x = -Math.PI/2; + trainmodel.children[0].rotation.z = trainmodel.children[0].rotation.y; + trainmodel.children[0].rotation.y = 0; + + // console.log(trainmodel.children[0].rotation.x); + // console.log(trainmodel.children[0].rotation.y); + // console.log(trainmodel.children[0].rotation.z); + let rotas = { + posr:point, + rota:trainmodel.children[0].rotation.z + } + trainmodel.children[1].rotalist.push(rotas); + + let offsetz = parseFloat(trainmodel.children[0].matrixWorld.elements[14]) - parseFloat(point.z); + trainmodel.children[0].position.z += offsetz; + //trainmodel.position.z = point.z; + } + + + + if(trainmodel.children[1].rotalist.length > 0 || trainmodel.children[2].rotalist.length > 0 || trainmodel.children[3].rotalist.length > 0 || trainmodel.children[4].rotalist.length > 0|| trainmodel.children[5].rotalist.length > 0){ + for(let rs = 1;rs<6;rs++){ + //console.log(rs); + if(trainmodel.children[rs].rotalist[0]){ + let offsetz = parseFloat(trainmodel.children[rs].matrixWorld.elements[14]) - parseFloat(trainmodel.children[rs].rotalist[0].posr.z); + + trainmodel.children[rs].position.z += offsetz; + + for(let xh=0;xh trainmodel.targetpercent){ + // if(trainmodel.rname == "001"){ + // console.log(trainmodel.targetLink); + // console.log(trainmodel.nowcode); + // console.log(1-trainmodel.progress); + // console.log(trainmodel.targetpercent); + // console.log("==============="); + // } + trainmodel.progress += trainmodel.speeds; + }else{ + trainmodel.statsstop = 1; + } + } + + } + + if(trainmodel.status == "02" && movecurve.points.length>1){ + let point = movecurve.getPointAt(trainmodel.progress); + trainmodel.position.x = point.x; + trainmodel.position.y = 0; + if(Math.abs( point.z -trainmodel.children[0].matrixWorld.elements[14]) >0.02){ + trainmodel.children[0].up = new THREE.Vector3(1,0,0); + let tangent = movecurve.getTangentAt(traindata.group.children[j].progress).normalize(); + trainmodel.children[0].axis.crossVectors(trainmodel.children[0].up, tangent).normalize(); + let radians = Math.acos(trainmodel.children[0].up.dot(tangent)); + trainmodel.children[0].quaternion.setFromAxisAngle(trainmodel.children[0].axis, radians); + trainmodel.children[0].rotation.x = -Math.PI/2; + trainmodel.children[0].rotation.z = trainmodel.children[0].rotation.y; + trainmodel.children[0].rotation.y = 0; + let rotas = { + posr:point, + rota:trainmodel.children[0].rotation.z + } + trainmodel.children[1].rotalist.push(rotas); + let offsetz = parseFloat(point.z) - parseFloat(trainmodel.children[0].matrixWorld.elements[14]); + trainmodel.children[0].position.z += offsetz; + //trainmodel.position.z = point.z; + } + + + if(trainmodel.children[1].rotalist.length > 0 || trainmodel.children[2].rotalist.length > 0 || trainmodel.children[3].rotalist.length > 0 || trainmodel.children[4].rotalist.length > 0|| trainmodel.children[5].rotalist.length > 0){ + + for(let rs = 1;rs<6;rs++){ + //console.log(rs); + if(trainmodel.children[rs].rotalist[0]){ + + let offsetz = parseFloat(trainmodel.children[rs].rotalist[0].posr.z) - parseFloat(trainmodel.children[rs].matrixWorld.elements[14]); + trainmodel.children[rs].position.z += offsetz; + + for(let xh=0;xh=trainmodel.children[rs].rotalist[0].posr.x){ + + if(rs != 5){ + let asd = trainmodel.children[rs].rotalist[0]; + trainmodel.children[rs+1].rotalist.push(asd); + + } + //let offsetx = trainmodel.children[1].matrixWorld.elements[12]-trainmodel.children[0].children[3].matrixWorld.elements[12]; + + trainmodel.children[rs].rotation.z = trainmodel.children[rs].rotalist[0].rota; + trainmodel.children[rs].rotalist.splice(0,1) + xh--; + }else{ + xh = trainmodel.children[rs].rotalist.length; + } + } + //console.log(trainmodel.children[rs].rotalist.length); + + } + + + } + // console.log(trainmodel.rotalist); + } + + if(trainmodel.statsstop == 0){ + if(trainmodel.progress < trainmodel.targetpercent){ + trainmodel.progress += trainmodel.speeds; + }else{ + trainmodel.statsstop = 1; + } + } + } + + + }else{ + if(trainmodel.nextcurve){ + // if(trainmodel.status == '02'){ + // }else if(trainmodel.status == '03'){ + // } + trainmodel.progress = 0; + trainmodel.len = trainmodel.nextlen; + if(trainmodel.nextcode){ + trainmodel.nowcode = trainmodel.nextcode; + } + + trainmodel.speeds = parseFloat(trainmodel.speed*10/36/25/trainmodel.len); + trainmodel.curve = trainmodel.nextcurve; + trainmodel.nextcurve = null; + trainmodel.nextlen = null; + trainmodel.nextcode = null; + } + // console.log(trainmodel.name); + // console.log(trainmodel.progress); + // console.log(trainmodel.nextcurve); + // if(trainmodel.status == "02"){ + // trainmodel.progress = 0; + // }else if(trainmodel.status == "03"){ + // trainmodel.progress = 1; + // } + // trainmodel.curve = trainmodel.nextcurve; + } + + } + } + } + + } + + } + +} diff --git a/src/jlmap3d/jl3dsimulation/jlmap3d.js b/src/jlmap3d/jl3dsimulation/jlmap3d.js index e1048d201..55d0f72a5 100644 --- a/src/jlmap3d/jl3dsimulation/jlmap3d.js +++ b/src/jlmap3d/jl3dsimulation/jlmap3d.js @@ -19,7 +19,7 @@ import { SetLights } from '@/jlmap3d/config/SetLights'; //controls import { OrbitControls } from '@/jlmap3d/main/control/OrbitControls'; -import { DragControls } from '@/jlmap3d/main/control/DragControls'; +// import { DragControls } from '@/jlmap3d/main/control/DragControls'; //加载器 import { ModelLoad } from '@/jlmap3d/main/loaders/ModelLoad'; @@ -29,7 +29,7 @@ import { getPublishMapVersion, getPublishMapDetail,getPublish3dMapDetail} from ' //utils // import { UpdateTrain } from '@/jlmap3d/main/utils/UpdateTrain'; -import { UpdateTrain } from '@/jlmap3d/main/utils/UpdateTrainTest'; +import { UpdateTrain } from '@/jlmap3d/jl3dsimulation/connect/UpdateTrainTest'; // import { ReStart } from '@/jlmap3d/main/utils/ReStart'; import {Stats} from '@/jlmap3d/main/lib/stats.min.js'; @@ -53,12 +53,11 @@ export function JLmap3d(dom, data,skinCode,storemod,routegroup) { let camera = SetCamera(dom); //定义场景(渲染容器) let scene = SetScene(); - //定义镜头操作 let controls = new THREE.OrbitControls(camera); controls.maxPolarAngle = Math.PI/2; //controls.minPolarAngle = Math.PI/8; - controls.maxDistance = 1500; + controls.maxDistance = 4800; //模型加载器 this.assetloader = new AssetLoader(); //替换材质组,例:信号机不同灯光 @@ -68,35 +67,86 @@ export function JLmap3d(dom, data,skinCode,storemod,routegroup) { //点击选中的模型 this.selectmodel = null; //鼠标点击模型切换 - this.raycasterswitch = "stand"; + this.raycasterswitch = "null"; //选中物体描边方框 this.helpbox = null; //车门,站台门道岔动画构造器 this.mixers = []; //模型操作命令组 this.actions = {}; + + let sectionlist = null; + let linklist = null; + let signallist = null; + let stationstandlist = null; + let trainlisttest = null; + let realsectionlist = null; + let rails = null; + this.webwork = new Worker("../../static/workertest/trainworker.js"); + this.jsonwebwork = new Worker("../../static/workertest/jsonworker.js"); //地图模型数据 let mapdata = new Jl3ddata(); //订阅仿真socket - console.log(routegroup); - this.Subscribe = new Jlmap3dSubscribe(this.webwork,routegroup); + // console.log(routegroup); + this.Subscribe = new Jlmap3dSubscribe(scope,routegroup,scope.jsonwebwork); //连接到通信 //console.log(this.Subscribe.config); //this.webwork.postMessage(this.Subscribe.teststomp); this.Subscribe.socketon(scope.Subscribe.topic); - //初始化加载数据和模型 - getPublish3dMapDetail(skinCode).then(netdata => { - ModelLoad(data,scope,netdata.data,mapdata,camera,controls,scene,storemod); + //初始化加载数据和模型getPublishMapDetail + getPublishMapDetail(skinCode).then(data => { + let mapnetdata = data.data; + getPublish3dMapDetail(skinCode).then(netdata => { + ModelLoad(mapnetdata,scope,netdata.data,mapdata,camera,controls,scene,storemod); + }); }); - // + // let stats = new Stats(); // dom.appendChild( stats.dom ); + + // var timer = setInterval(function() { + // if(trainlisttest){ + // if(trainlisttest.group){ + // if(trainlisttest.group.children[0]){ + // for(let k in rails.switchrail){ + // const ddd = storemod.getters['map/getDeviceByCode'](k); + // let switchdata = rails.switchrail[k]; + // rails.switchrail[k].locateType = ddd.locateType; + // + // if(ddd.locateType == "01"){ + // //1--向左 2--向右 + // //__\__ __/__ + // if(rails.switchrail[k].directtype == "1"){ + // rails.linkrail[switchdata.alink].lconnect = switchdata.blink; + // rails.linkrail[switchdata.blink].rconnect = switchdata.alink; + // }else if(rails.switchrail[k].directtype == "2"){ + // rails.linkrail[switchdata.alink].rconnect = switchdata.blink; + // rails.linkrail[switchdata.blink].lconnect = switchdata.alink; + // } + // + // }else if(ddd.locateType == "02"){ + // if(rails.switchrail[k].directtype == "1"){ + // rails.linkrail[switchdata.alink].lconnect = switchdata.clink; + // rails.linkrail[switchdata.clink].rconnect = switchdata.alink; + // }else if(rails.switchrail[k].directtype == "2"){ + // rails.linkrail[switchdata.alink].rconnect = switchdata.clink; + // rails.linkrail[switchdata.clink].lconnect = switchdata.alink; + // } + // } + // } + // clearInterval(timer); + // } + // } + // } + // + // }, 2000); + controls.upscene(scope.animateswitch); //开启渲染 animate(); - startWorker(); + startWorker(scope.webwork); //动画时间 let delta; //循环渲染函数 @@ -107,28 +157,35 @@ export function JLmap3d(dom, data,skinCode,storemod,routegroup) { requestAnimationFrame(animate); //判断渲染是否开启 if(scope.animateswitch == true){ + // if(camera.position.y<4000){ + // + // } //根据相机渲染场景 renderer.render(scene,camera); + // console.log(scope.animateswitch); //检测动画构造器播放动画 - // stats.update(); - } + } + // stats.update(); } - function startWorker(){ + function startWorker(webwork){ if(typeof(Worker)!=="undefined"){ scope.webwork.onmessage = function (event) { //更新列车位置 - UpdateTrain(camera,mapdata.trainlisttest); + UpdateTrain(camera,trainlisttest); delta = clock.getDelta(); + for(let i=scope.mixers.length-1;i>=0;i--){ if ( scope.mixers[i] ){ scope.mixers[i].update( delta ); } } + renderer.render(scene,camera); + }; } @@ -166,24 +223,24 @@ export function JLmap3d(dom, data,skinCode,storemod,routegroup) { this.showstationmsg = function(showtype){ if(showtype == "show"){ - for(let st=0;st=0; i --){ @@ -158,8 +168,6 @@ THREE.OrbitControls = function ( object, domElement ) { } } - } - var position = scope.object.position; offset.copy( position ).sub( scope.target ); @@ -491,6 +499,9 @@ THREE.OrbitControls = function ( object, domElement ) { rotateUp( 2 * Math.PI * rotateDelta.y / element.clientHeight ); rotateStart.copy( rotateEnd ); + // if(scope.render){ + // scope.render.render(scope.scene,scope.object); + // } scope.update(); @@ -780,7 +791,7 @@ THREE.OrbitControls = function ( object, domElement ) { if ( scope.enabled === false ) return; event.preventDefault(); - + scope.animateswitch = true; switch ( state ) { case STATE.ROTATE: @@ -814,7 +825,7 @@ THREE.OrbitControls = function ( object, domElement ) { function onMouseUp( event ) { if ( scope.enabled === false ) return; - + scope.animateswitch = false; handleMouseUp( event ); document.removeEventListener( 'mousemove', onMouseMove, false ); diff --git a/src/jlmap3d/main/loaders/AssetLoader.js b/src/jlmap3d/main/loaders/AssetLoader.js index a24921f68..1fcefdef6 100644 --- a/src/jlmap3d/main/loaders/AssetLoader.js +++ b/src/jlmap3d/main/loaders/AssetLoader.js @@ -36,6 +36,15 @@ let defaultstation = { picUrl:"", assetUrl:modelurl+"/models/station/fuzhou/fuzhou.FBX" } + +let defaulttopstation = { + id:"104", + name:"福州车站1", + deviceType:"topstand", + type:"num5", + picUrl:"", + assetUrl:modelurl+"/models/station/fuzhou/topstation.FBX" +} //modelurl+"/models/station/fuzhou/fuzhou.FBX" //https://test.joylink.club/oss/models/station/fuzhou/fuzhou.FBX //https://joylink.club/oss/models/station/fuzhou/fuzhou.FBX @@ -65,7 +74,16 @@ let defaultsuidao = { deviceType:"suidao", type:"suidao", picUrl:"", - assetUrl:"../../static/model/suidao/suidao.FBX" + assetUrl:modelurl+"/models/suidao/suidao.FBX" +} + +let defaultbackground = { + id:"16", + name:"background", + deviceType:"background", + type:"background", + picUrl:"", + assetUrl:modelurl+"/models/suidao/background.FBX" } //modelurl+"/models/suidao/suidao.FBX" //https://test.joylink.club/oss/models/suidao/suidao.FBX @@ -134,12 +152,18 @@ export function AssetLoader(){ let station = new AssetModel(defaultstation); scope.modellist.push(station); + let topstation = new AssetModel(defaulttopstation); + scope.modellist.push(topstation); + let driver = new AssetModel(defaultdriver); scope.modellist.push(driver); let suidao = new AssetModel(defaultsuidao); scope.modellist.push(suidao); + let background = new AssetModel(defaultbackground); + scope.modellist.push(defaultbackground); + let defaultswitch1 = new AssetModel(autoswitch1); scope.modellist.push(defaultswitch1); @@ -202,6 +226,9 @@ export function AssetLoader(){ let station = new AssetModel(defaultstation); scope.modellist.push(station); + let topstation = new AssetModel(defaulttopstation); + scope.modellist.push(topstation); + let autorail = new AssetModel(defaultautorail); scope.modellist.push(autorail); diff --git a/src/jlmap3d/main/loaders/ModelLoad.js b/src/jlmap3d/main/loaders/ModelLoad.js index 8b52e5ed5..02f00cc99 100644 --- a/src/jlmap3d/main/loaders/ModelLoad.js +++ b/src/jlmap3d/main/loaders/ModelLoad.js @@ -18,6 +18,7 @@ export function ModelLoad(data,scope,netdata,mapdata,camera,controls,scene,store //console.log(data); //console.log(scope); let sceneload = scene; + let backdata = scope; let jlmap3ddata = mapdata; let assetloader = scope.assetloader; let animateswitch = scope.animateswitch; @@ -25,6 +26,8 @@ export function ModelLoad(data,scope,netdata,mapdata,camera,controls,scene,store let mixers = scope.mixers; let actions = scope.actions; + let linklist,sectionlist,signallist,stationstandlist,trainlisttest,realsectionlist,rails; + let loadingInstance = Loading.service({ fullscreen: true }); @@ -50,17 +53,17 @@ export function ModelLoad(data,scope,netdata,mapdata,camera,controls,scene,store // console.log(data); //初始化轨道和道岔 暂时 lengthfact(data); - jlmap3ddata.linklist = new LinkList(); - jlmap3ddata.sectionlist = new SectionList(); + linklist = new LinkList(); + sectionlist = new SectionList(); //初始化信号机 - jlmap3ddata.signallist = new SignalList(); + signallist = new SignalList(); //初始化站台 - jlmap3ddata.stationstandlist = new StationStandList(); + stationstandlist = new StationStandList(); //初始化测试列车 - jlmap3ddata.trainlisttest = new TrainList(); + trainlisttest = new TrainList(); - jlmap3ddata.realsectionlist = new RealSectionList(); - jlmap3ddata.rails = new RailList(); + realsectionlist = new RealSectionList(); + rails = new RailList(); let loaderdata = JSON.parse(netdata.sections); let switchdata = JSON.parse(netdata.switchs); let signaldata = JSON.parse(netdata.signals); @@ -71,32 +74,33 @@ export function ModelLoad(data,scope,netdata,mapdata,camera,controls,scene,store assetloader.assetpromise(sceneload) .then(function(data){ //console.log(data); - return jlmap3ddata.linklist.loadpromise(loaderdata.link,scene,assetloader); + return linklist.loadpromise(loaderdata.link,scene,assetloader); }) .then(function(data){ //console.log(data); - return jlmap3ddata.stationstandlist.initpromise(mapdata.stationList,mapdata.stationStandList,sceneload,assetloader,netdata.stands,mixers,actions,"02"); + return stationstandlist.initpromise(mapdata.stationList,mapdata.stationStandList,sceneload,assetloader,netdata.stands,mixers,actions,"02"); }) .then(function(data){ //console.log(data); //console.log(assetloader); - return jlmap3ddata.trainlisttest.initpromise(mapdata.trainList,sceneload,assetloader,mixers,actions,"02"); + return trainlisttest.initpromise(mapdata.trainList,sceneload,assetloader,mixers,actions,"02"); }) .then(function(data){ //console.log(data); - return jlmap3ddata.sectionlist.loadpromise(jlmap3ddata,assetloader,loaderdata.section,switchdata,sceneload); + return sectionlist.loadpromise(linklist,assetloader,loaderdata.section,switchdata,sceneload); }) - // .then(function(data){ - // //console.log(data); - // return jlmap3ddata.realsectionlist.initpromise(jlmap3ddata,sceneload,assetloader,mixers,actions); - // }) + // // .then(function(data){ + // // //console.log(data); + // // return realsectionlist.initpromise(jlmap3ddata,sceneload,assetloader,mixers,actions); + // // }) .then(function(data){ //console.log(data); - return jlmap3ddata.signallist.initpromise(mapdata.signalList,sceneload,assetloader,netdata.signals); + return signallist.initpromise(mapdata.signalList,sceneload,assetloader,netdata.signals); }) .then(function(data){ return new Promise(function(resolve, reject){ - jlmap3ddata.rails.init(loaderdata.link,mapdata.linkList,mapdata.sectionList,switchdata,standsdata,sceneload,storemod); + let stopoffset = 61.92; + rails.init(loaderdata.link,mapdata.linkList,mapdata.sectionList,switchdata, stationstandlist.list,sceneload,storemod,stopoffset); resolve("loadrail"); }); @@ -106,23 +110,33 @@ export function ModelLoad(data,scope,netdata,mapdata,camera,controls,scene,store if(scope.assetloader.modellist[mn].name && scope.assetloader.modellist[mn].name == "suidao"){ // scope.assetloader.modellist[mn].mesh.rotation.x = Math.PI/2; // console.log(scope.assetloader.modellist[mn].mesh.position); + scope.assetloader.modellist[mn].mesh.name = "suidao"; + scene.add(scope.assetloader.modellist[mn].mesh); + } + if(scope.assetloader.modellist[mn].name && scope.assetloader.modellist[mn].name == "background"){ + // scope.assetloader.modellist[mn].mesh.rotation.x = Math.PI/2; + // console.log(scope.assetloader.modellist[mn].mesh.position); + scope.assetloader.modellist[mn].mesh.name = "background"; + // console.log(scope.assetloader.modellist[mn].mesh); scene.add(scope.assetloader.modellist[mn].mesh); } } - scope.animateswitch = true; + // scope.animateswitch = true; - mapdata = jlmap3ddata; //console.log(scope); //更新相机方向 - scope.updatecamera(mapdata.stationstandlist.group.children[0],"station"); - - scope.Subscribe.updatamap(mapdata,scope.materiallist,scope.actions,scope.sceneload); - - updatemenulist(mapdata.stationstandlist.list,mapdata.trainlisttest.list); + backdata.loaderdata(sectionlist,linklist,signallist,stationstandlist,trainlisttest,realsectionlist,rails); + scope.updatecamera(stationstandlist.group.children[0],"station"); + // + scope.Subscribe.updatamap(sectionlist,linklist,signallist,stationstandlist,trainlisttest,realsectionlist,rails,scope.materiallist,scope.actions,scope.sceneload); + // + updatemenulist(stationstandlist.list,trainlisttest.list); scope.webwork.postMessage("on"); + scope.jsonwebwork.postMessage("connect"); + // console.log(sceneload); loadingInstance.close(); }); diff --git a/src/jlmap3d/main/loaders/simulationloader.js b/src/jlmap3d/main/loaders/simulationloader.js index e92ebdf5f..2678bd4bb 100644 --- a/src/jlmap3d/main/loaders/simulationloader.js +++ b/src/jlmap3d/main/loaders/simulationloader.js @@ -18,7 +18,6 @@ export function ModelLoad(data,scope,netdata,sectionlist,linklist,signallist,sta //console.log(data); //console.log(scope); let sceneload = scene; - // let jlmap3ddata = mapdata; let backdata = scope; let assetloader = scope.assetloader; let animateswitch = scope.animateswitch; @@ -97,8 +96,9 @@ export function ModelLoad(data,scope,netdata,sectionlist,linklist,signallist,sta }) .then(function(data){ return new Promise(function(resolve, reject){ + let stopoffset = 64; rails.init(loaderdata.link,mapdata.linkList,mapdata.sectionList,switchdata, - stationstandlist.list,sceneload,storemod); + stationstandlist.list,sceneload,storemod,stopoffset); resolve("loadrail"); }); diff --git a/src/jlmap3d/main/model/LinkList.js b/src/jlmap3d/main/model/LinkList.js index 1a0d4d5bc..210e350d3 100644 --- a/src/jlmap3d/main/model/LinkList.js +++ b/src/jlmap3d/main/model/LinkList.js @@ -80,6 +80,8 @@ function linkhelp(data,scene){ for(let i=0;i=0;n--){ + if(assetloader.modellist[n].deviceType == "train"){ + + selectmesh = assetloader.modellist[n].mesh + + ntracks1 = assetloader.modellist[n].animations.slice(24,52); + + tclip = new THREE.AnimationClip("three",2,ntracks1); + + ntracks2 = assetloader.modellist[n].animations.slice(0,24); + + fclip = new THREE.AnimationClip("four",2,ntracks2); + + n = 0; + } + } //遍历列车数据 + // console.log(data.length); for(let i=0;i=0;n--){ - if(assetloader.modellist[n].deviceType == "train"){ - newmesh = assetloader.modellist[n].mesh.clone(true); - - ntracks1 = assetloader.modellist[n].animations.slice(24,52); - - tclip = new THREE.AnimationClip("three",2,ntracks1); - - ntracks2 = assetloader.modellist[n].animations.slice(0,24); - - fclip = new THREE.AnimationClip("four",2,ntracks2); - - n = 0; - } - } actionss[data[i].code] = { top:[], down:[] }; - + let newmesh = selectmesh.clone(true); + newmesh.mixer = []; + // console.log("-------------------------"); + // console.log(data[i]); for(let j=0;j import('@/views/login/index'); const Jlmap3dedit = () => import('@/views/jlmap3d/edit/jlmap3dedit'); const Jlmap3d = () => import('@/views/jlmap3d/drive/jl3ddrive'); +const Jlmap3dSandbox = () => import('@/views/jlmap3d/simulation/jl3dsimulation'); const Display = () => import('@/views/display/index'); const DesignDisplay = () => import('@/views/display/designIndex'); @@ -270,6 +271,11 @@ export const constantRoutes = [ component: Jlmap3dedit, hidden: true }, + { + path: '/jlmap3d/sandbox', + component: Jlmap3dSandbox, + hidden: true + }, { path: '/401', component: Error401, diff --git a/src/views/display/index.vue b/src/views/display/index.vue index d44e25291..1f2a41949 100644 --- a/src/views/display/index.vue +++ b/src/views/display/index.vue @@ -41,7 +41,7 @@ - + @@ -72,9 +72,9 @@ import { EventBus } from '@/scripts/event-bus'; import Vue from 'vue'; // 三维 -import Jl3dSimulation from '@/views/jlmap3d/simulation/jl3dsimulation'; +// import Jl3dSimulation from '@/views/jlmap3d/simulation/jl3dsimulation'; import Jl3dDrive from '@/views/jlmap3d/drive/jl3ddrive'; - +import { getToken } from '@/utils/auth'; export default { name: 'DisplayDraft', components: { @@ -88,7 +88,7 @@ export default { MenuScript, MenuSchema, MenuSystemTime, - Jl3dSimulation, + // Jl3dSimulation, Jl3dDrive, Scheduling }, @@ -526,9 +526,15 @@ export default { this.drivingShow = true; this.$refs.Jl3dDrive.show(this.mapId, this.group); } else { - this.panelShow = false; - this.simulationShow = true; - this.$refs.Jl3dSimulation.show(this.mapId, this.group); + let routeData = this.$router.resolve({ +   path:'/jlmap3d/sandbox', + query:{ + mapid:this.mapId, + group:this.group, + token:getToken(), + } + }); + window.open(routeData.href, '_blank','noopener noreferrer'); } }, showScheduling() { diff --git a/src/views/jlmap3d/drive/jl3ddrive.vue b/src/views/jlmap3d/drive/jl3ddrive.vue index 95c7708d8..1edae894e 100644 --- a/src/views/jlmap3d/drive/jl3ddrive.vue +++ b/src/views/jlmap3d/drive/jl3ddrive.vue @@ -143,6 +143,7 @@ export default { beforeDestroy() { if (this.jlmap3d) { this.jlmap3d.webwork.postMessage('off'); + this.jlmap3d.webwork.terminate(); this.jlmap3d.endsocket(); this.jlmap3d.dispose(); this.jlmap3d = null; diff --git a/src/views/jlmap3d/simulation/jl3dsimulation.vue b/src/views/jlmap3d/simulation/jl3dsimulation.vue index 718ba11f6..972200efd 100644 --- a/src/views/jlmap3d/simulation/jl3dsimulation.vue +++ b/src/views/jlmap3d/simulation/jl3dsimulation.vue @@ -74,7 +74,10 @@ export default { mapdata: null, jlmap3d: null, - selectmodel: null + selectmodel: null, + mapid:null, + group:null, + token:null }; }, watch: { @@ -93,7 +96,9 @@ export default { beforeDestroy() { // console.log("destroy"); if (this.jlmap3d) { - this.jlmap3d.webwork.postMessage('off'); + this.jlmap3d.webwork.postMessage('off'); + this.jlmap3d.webwork.terminate(); + this.jlmap3d.jsonwebwork.terminate(); this.jlmap3d.dispose(); this.jlmap3d = null; // this.$destroy(); @@ -102,12 +107,19 @@ export default { mounted() { window.updatemenulist = this.updatemenulist; - // this.init(); + this.getParams(); + + // console.log(""); }, methods: { + getParams:function(){ + var routerParams = this.$route.query.group + this.mapid = this.$route.query.mapid; + this.group = this.$route.query.group; + this.token = this.$route.query.token; + this.init(this.mapid,this.group); + }, show: function (skinCode,group) { - // console.log(skinCode); - // console.log(this.jlmap3d); if (this.jlmap3d == null) { this.init(skinCode,group); } else { @@ -170,10 +182,10 @@ export default { }, back() { - - this.$emit('showpanel'); - this.jlmap3d.eventoff(); - this.jlmap3d.animateoff(); + window.close(); + // this.$emit('showpanel'); + // this.jlmap3d.eventoff(); + // this.jlmap3d.animateoff(); // this.jlmap3d = null; } diff --git a/src/views/jlmap3d/simulation/show/menu.vue b/src/views/jlmap3d/simulation/show/menu.vue index 13ceed726..e3906791a 100644 --- a/src/views/jlmap3d/simulation/show/menu.vue +++ b/src/views/jlmap3d/simulation/show/menu.vue @@ -8,7 +8,6 @@
-

车站:{{station.rname}}

车站编号:{{station.name}}

diff --git a/static/model/station/fuzhou.FBX b/static/model/station/fuzhou.FBX index 09236846a..f31f06d5f 100644 Binary files a/static/model/station/fuzhou.FBX and b/static/model/station/fuzhou.FBX differ diff --git a/static/model/station/fuzhouold.FBX b/static/model/station/fuzhouold.FBX new file mode 100644 index 000000000..09236846a Binary files /dev/null and b/static/model/station/fuzhouold.FBX differ diff --git a/static/model/station/topstation.FBX b/static/model/station/topstation.FBX new file mode 100644 index 000000000..fd2e02516 Binary files /dev/null and b/static/model/station/topstation.FBX differ diff --git a/static/model/suidao/background.FBX b/static/model/suidao/background.FBX new file mode 100644 index 000000000..1003e92aa Binary files /dev/null and b/static/model/suidao/background.FBX differ diff --git a/static/model/suidao/background1.FBX b/static/model/suidao/background1.FBX new file mode 100644 index 000000000..074f6ef93 Binary files /dev/null and b/static/model/suidao/background1.FBX differ diff --git a/static/model/suidao/suidao.FBX b/static/model/suidao/suidao.FBX index ee589e0a9..665e67b82 100644 Binary files a/static/model/suidao/suidao.FBX and b/static/model/suidao/suidao.FBX differ diff --git a/static/model/suidao/suidao1.FBX b/static/model/suidao/suidao1.FBX index 38c046af3..58b2e10cf 100644 Binary files a/static/model/suidao/suidao1.FBX and b/static/model/suidao/suidao1.FBX differ diff --git a/static/workertest/jsonworker.js b/static/workertest/jsonworker.js new file mode 100644 index 000000000..ce4a8856b --- /dev/null +++ b/static/workertest/jsonworker.js @@ -0,0 +1,720 @@ +importScripts('sockjs.js'); +// import { getToken } from '@/utils/auth'; +// import { getBaseUrl } from '@/utils/baseUrl'; +// import SockJS from 'sockjs-client'; + +// const websocketUrl = 'ws://test.joylink.club/jlcloud/joylink-websocket?token='; +// const websocketUrl = `http://192.168.3.6:9000/joylink-websocket?token=`; +let websocketUrl = null; +let token = null; +var StompClient = function (headers,token) { + let scope = this; + this.url = websocketUrl + token; + this.headers = headers || {}; + this.connect(); +}; + +StompClient.prototype = { + socket: null, + + clientIns: null, + + subscribeMap: null, + + url: '', + + status: false, + + sockStatus: 0, + + headers: { + // 'X-Token': getToken() + }, + + count: 0, + + topic: '', + + onmessage: null, + + checkTimer: null, + + // 连接服务端 + connect() { + return new Promise((resolve, reject) => { + try { + // 断开已有连接 + if (this.clientIns && this.clientIns.connected) { + this.clientIns.disconnect(); + this.clientIns = null; + } + + // 建立连接对象(还未发起连接) + this.socket = new SockJS(websocketUrl + token); + + // 获取 STOMP 子协议的客户端对象 + this.clientIns = Stomp.over(this.socket); + + this.closeStompDebug(); + + // 向服务器发起websocket连接并发送CONNECT帧 + this.clientIns.connect({ 'X-Token': token }, () => { + console.info('连接成功.'); + this.count = 0; + this.status = true; + + // 恢复订阅 + if (this.topic && this.onmessage) { + this.unsubscribe(this.topic); + this.subscribe(this.topic, this.onmessage, this.headers); + } + + + resolve(this); + }, () => { + if (this.checkTimer) { + clearInterval(this.checkTimer); + this.checkTimer = null; + } + + }); + } catch (err) { + reject(err); + } + }); + + }, + logOut(err) { + if (err.code == 50008 || err.code == 50014) { + this.url = websocketUrl + token; + this.status = false; + this.count++; + this.reconnect(this.count); + } + }, + // 恢复链接 + reconnect(count) { + console.info(`尝试第${count || 1}次连接.`); + this.connect().then(() => { }).catch(() => { + this.count++; + this.reconnect(this.count); + }); + }, + + closeStompDebug() { + if (this.clientIns) { + this.clientIns.debug = undefined; + + } + }, + + // 订阅指定的topic + subscribe(topic, onmessage, headers) { + this.topic = topic; + this.onmessage = onmessage; + this.headers = headers; + if (this.status) { + if (!this.subscribeMap) { + this.subscribeMap = new Map(); + } + + try { + var subscription = this.subscribeMap.get(topic); + if (!subscription) { + subscription = this.clientIns.subscribe(topic, onmessage, headers); // 接收消息通过 subscribe() 方法实现 + this.subscribeMap.set(topic, subscription); + } + } catch (err) { + setTimeout(() => { + this.subscribe(topic, onmessage, headers); + }, 300); + } + + } else { + setTimeout(() => { + this.subscribe(topic, onmessage, headers); + }, 300); + } + }, + + unsubscribe(topic) { + if (this.subscribeMap) { + const subscription = this.subscribeMap.get(topic); + if (subscription) { + subscription.unsubscribe(); + this.subscribeMap.delete(topic); + console.log('取消订阅'); + } + } + }, + + // 发送消息 + send(url, msg) { + if (this.status) { + if (msg) { + msg = JSON.stringify(msg); + } + try { + this.clientIns.send(url, {}, msg); + } catch (err) { + this.status = false; + this.send(url, msg); + } + } else { + setTimeout(() => { + this.send(url, msg); + }, 300); + } + }, + + disconnect() { + if (this.checkTimer) { + clearInterval(this.checkTimer); + this.checkTimer = null; + } + + if (this.clientIns && this.clientIns.connected) { + this.clientIns.disconnect(); + this.clientIns = null; + } + this.status = false; + console.log('断开连接'); + } + +}; + + + + + var Byte, Client, Frame, Stomp, + __hasProp = {}.hasOwnProperty, + __slice = [].slice; + + Byte = { + LF: '\x0A', + NULL: '\x00' + }; + + Frame = (function() { + var unmarshallSingle; + + function Frame(command, headers, body) { + this.command = command; + this.headers = headers != null ? headers : {}; + this.body = body != null ? body : ''; + } + + Frame.prototype.toString = function() { + var lines, name, skipContentLength, value, _ref; + lines = [this.command]; + skipContentLength = this.headers['content-length'] === false ? true : false; + if (skipContentLength) { + delete this.headers['content-length']; + } + _ref = this.headers; + for (name in _ref) { + if (!__hasProp.call(_ref, name)) continue; + value = _ref[name]; + lines.push("" + name + ":" + value); + } + if (this.body && !skipContentLength) { + lines.push("content-length:" + (Frame.sizeOfUTF8(this.body))); + } + lines.push(Byte.LF + this.body); + return lines.join(Byte.LF); + }; + + Frame.sizeOfUTF8 = function(s) { + if (s) { + return encodeURI(s).match(/%..|./g).length; + } else { + return 0; + } + }; + + unmarshallSingle = function(data) { + var body, chr, command, divider, headerLines, headers, i, idx, len, line, start, trim, _i, _j, _len, _ref, _ref1; + divider = data.search(RegExp("" + Byte.LF + Byte.LF)); + headerLines = data.substring(0, divider).split(Byte.LF); + command = headerLines.shift(); + headers = {}; + trim = function(str) { + return str.replace(/^\s+|\s+$/g, ''); + }; + _ref = headerLines.reverse(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + line = _ref[_i]; + idx = line.indexOf(':'); + headers[trim(line.substring(0, idx))] = trim(line.substring(idx + 1)); + } + body = ''; + start = divider + 2; + if (headers['content-length']) { + len = parseInt(headers['content-length']); + body = ('' + data).substring(start, start + len); + } else { + chr = null; + for (i = _j = start, _ref1 = data.length; start <= _ref1 ? _j < _ref1 : _j > _ref1; i = start <= _ref1 ? ++_j : --_j) { + chr = data.charAt(i); + if (chr === Byte.NULL) { + break; + } + body += chr; + } + } + return new Frame(command, headers, body); + }; + + Frame.unmarshall = function(datas) { + var data; + return (function() { + var _i, _len, _ref, _results; + _ref = datas.split(RegExp("" + Byte.NULL + Byte.LF + "*")); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + data = _ref[_i]; + if ((data != null ? data.length : void 0) > 0) { + _results.push(unmarshallSingle(data)); + } + } + return _results; + })(); + }; + + Frame.marshall = function(command, headers, body) { + var frame; + frame = new Frame(command, headers, body); + return frame.toString() + Byte.NULL; + }; + + return Frame; + + })(); + + Client = (function() { + var now; + + function Client(ws) { + this.ws = ws; + this.ws.binaryType = "arraybuffer"; + this.counter = 0; + this.connected = false; + this.heartbeat = { + outgoing: 10000, + incoming: 10000 + }; + this.maxWebSocketFrameSize = 16 * 1024; + this.subscriptions = {}; + } + + Client.prototype.debug = function(message) { + var _ref; + return typeof window !== "undefined" && window !== null ? (_ref = window.console) != null ? _ref.log(message) : void 0 : void 0; + }; + + now = function() { + if (Date.now) { + return Date.now(); + } else { + return new Date().valueOf; + } + }; + + Client.prototype._transmit = function(command, headers, body) { + var out; + out = Frame.marshall(command, headers, body); + if (typeof this.debug === "function") { + this.debug(">>> " + out); + } + while (true) { + if (out.length > this.maxWebSocketFrameSize) { + this.ws.send(out.substring(0, this.maxWebSocketFrameSize)); + out = out.substring(this.maxWebSocketFrameSize); + if (typeof this.debug === "function") { + this.debug("remaining = " + out.length); + } + } else { + return this.ws.send(out); + } + } + }; + + Client.prototype._setupHeartbeat = function(headers) { + var serverIncoming, serverOutgoing, ttl, v, _ref, _ref1; + if ((_ref = headers.version) !== Stomp.VERSIONS.V1_1 && _ref !== Stomp.VERSIONS.V1_2) { + return; + } + _ref1 = (function() { + var _i, _len, _ref1, _results; + _ref1 = headers['heart-beat'].split(","); + _results = []; + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + v = _ref1[_i]; + _results.push(parseInt(v)); + } + return _results; + })(), serverOutgoing = _ref1[0], serverIncoming = _ref1[1]; + if (!(this.heartbeat.outgoing === 0 || serverIncoming === 0)) { + ttl = Math.max(this.heartbeat.outgoing, serverIncoming); + if (typeof this.debug === "function") { + this.debug("send PING every " + ttl + "ms"); + } + this.pinger = Stomp.setInterval(ttl, (function(_this) { + return function() { + _this.ws.send(Byte.LF); + return typeof _this.debug === "function" ? _this.debug(">>> PING") : void 0; + }; + })(this)); + } + if (!(this.heartbeat.incoming === 0 || serverOutgoing === 0)) { + ttl = Math.max(this.heartbeat.incoming, serverOutgoing); + if (typeof this.debug === "function") { + this.debug("check PONG every " + ttl + "ms"); + } + return this.ponger = Stomp.setInterval(ttl, (function(_this) { + return function() { + var delta; + delta = now() - _this.serverActivity; + if (delta > ttl * 2) { + if (typeof _this.debug === "function") { + _this.debug("did not receive server activity for the last " + delta + "ms"); + } + return _this.ws.close(); + } + }; + })(this)); + } + }; + + Client.prototype._parseConnect = function() { + var args, connectCallback, errorCallback, headers; + args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + headers = {}; + switch (args.length) { + case 2: + headers = args[0], connectCallback = args[1]; + break; + case 3: + if (args[1] instanceof Function) { + headers = args[0], connectCallback = args[1], errorCallback = args[2]; + } else { + headers.login = args[0], headers.passcode = args[1], connectCallback = args[2]; + } + break; + case 4: + headers.login = args[0], headers.passcode = args[1], connectCallback = args[2], errorCallback = args[3]; + break; + default: + headers.login = args[0], headers.passcode = args[1], connectCallback = args[2], errorCallback = args[3], headers.host = args[4]; + } + return [headers, connectCallback, errorCallback]; + }; + + Client.prototype.connect = function() { + var args, errorCallback, headers, out; + args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + out = this._parseConnect.apply(this, args); + headers = out[0], this.connectCallback = out[1], errorCallback = out[2]; + if (typeof this.debug === "function") { + this.debug("Opening Web Socket..."); + } + this.ws.onmessage = (function(_this) { + return function(evt) { + var arr, c, client, data, frame, messageID, onreceive, subscription, _i, _len, _ref, _results; + data = typeof ArrayBuffer !== 'undefined' && evt.data instanceof ArrayBuffer ? (arr = new Uint8Array(evt.data), typeof _this.debug === "function" ? _this.debug("--- got data length: " + arr.length) : void 0, ((function() { + var _i, _len, _results; + _results = []; + for (_i = 0, _len = arr.length; _i < _len; _i++) { + c = arr[_i]; + _results.push(String.fromCharCode(c)); + } + return _results; + })()).join('')) : evt.data; + _this.serverActivity = now(); + if (data === Byte.LF) { + if (typeof _this.debug === "function") { + _this.debug("<<< PONG"); + } + return; + } + if (typeof _this.debug === "function") { + _this.debug("<<< " + data); + } + _ref = Frame.unmarshall(data); + _results = []; + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + frame = _ref[_i]; + switch (frame.command) { + case "CONNECTED": + if (typeof _this.debug === "function") { + _this.debug("connected to server " + frame.headers.server); + } + _this.connected = true; + _this._setupHeartbeat(frame.headers); + _results.push(typeof _this.connectCallback === "function" ? _this.connectCallback(frame) : void 0); + break; + case "MESSAGE": + subscription = frame.headers.subscription; + onreceive = _this.subscriptions[subscription] || _this.onreceive; + if (onreceive) { + client = _this; + messageID = frame.headers["message-id"]; + frame.ack = function(headers) { + if (headers == null) { + headers = {}; + } + return client.ack(messageID, subscription, headers); + }; + frame.nack = function(headers) { + if (headers == null) { + headers = {}; + } + return client.nack(messageID, subscription, headers); + }; + _results.push(onreceive(frame)); + } else { + _results.push(typeof _this.debug === "function" ? _this.debug("Unhandled received MESSAGE: " + frame) : void 0); + } + break; + case "RECEIPT": + _results.push(typeof _this.onreceipt === "function" ? _this.onreceipt(frame) : void 0); + break; + case "ERROR": + _results.push(typeof errorCallback === "function" ? errorCallback(frame) : void 0); + break; + default: + _results.push(typeof _this.debug === "function" ? _this.debug("Unhandled frame: " + frame) : void 0); + } + } + return _results; + }; + })(this); + this.ws.onclose = (function(_this) { + return function() { + var msg; + msg = "Whoops! Lost connection to " + _this.ws.url; + if (typeof _this.debug === "function") { + _this.debug(msg); + } + _this._cleanUp(); + return typeof errorCallback === "function" ? errorCallback(msg) : void 0; + }; + })(this); + return this.ws.onopen = (function(_this) { + return function() { + if (typeof _this.debug === "function") { + _this.debug('Web Socket Opened...'); + } + headers["accept-version"] = Stomp.VERSIONS.supportedVersions(); + headers["heart-beat"] = [_this.heartbeat.outgoing, _this.heartbeat.incoming].join(','); + return _this._transmit("CONNECT", headers); + }; + })(this); + }; + + Client.prototype.disconnect = function(disconnectCallback, headers) { + if (headers == null) { + headers = {}; + } + this._transmit("DISCONNECT", headers); + this.ws.onclose = null; + this.ws.close(); + this._cleanUp(); + return typeof disconnectCallback === "function" ? disconnectCallback() : void 0; + }; + + Client.prototype._cleanUp = function() { + this.connected = false; + if (this.pinger) { + Stomp.clearInterval(this.pinger); + } + if (this.ponger) { + return Stomp.clearInterval(this.ponger); + } + }; + + Client.prototype.send = function(destination, headers, body) { + if (headers == null) { + headers = {}; + } + if (body == null) { + body = ''; + } + headers.destination = destination; + return this._transmit("SEND", headers, body); + }; + + Client.prototype.subscribe = function(destination, callback, headers) { + var client; + if (headers == null) { + headers = {}; + } + if (!headers.id) { + headers.id = "sub-" + this.counter++; + } + headers.destination = destination; + this.subscriptions[headers.id] = callback; + this._transmit("SUBSCRIBE", headers); + client = this; + return { + id: headers.id, + unsubscribe: function() { + return client.unsubscribe(headers.id); + } + }; + }; + + Client.prototype.unsubscribe = function(id) { + delete this.subscriptions[id]; + return this._transmit("UNSUBSCRIBE", { + id: id + }); + }; + + Client.prototype.begin = function(transaction) { + var client, txid; + txid = transaction || "tx-" + this.counter++; + this._transmit("BEGIN", { + transaction: txid + }); + client = this; + return { + id: txid, + commit: function() { + return client.commit(txid); + }, + abort: function() { + return client.abort(txid); + } + }; + }; + + Client.prototype.commit = function(transaction) { + return this._transmit("COMMIT", { + transaction: transaction + }); + }; + + Client.prototype.abort = function(transaction) { + return this._transmit("ABORT", { + transaction: transaction + }); + }; + + Client.prototype.ack = function(messageID, subscription, headers) { + if (headers == null) { + headers = {}; + } + headers["message-id"] = messageID; + headers.subscription = subscription; + return this._transmit("ACK", headers); + }; + + Client.prototype.nack = function(messageID, subscription, headers) { + if (headers == null) { + headers = {}; + } + headers["message-id"] = messageID; + headers.subscription = subscription; + return this._transmit("NACK", headers); + }; + + return Client; + + })(); + + Stomp = { + VERSIONS: { + V1_0: '1.0', + V1_1: '1.1', + V1_2: '1.2', + supportedVersions: function() { + return '1.1,1.0'; + } + }, + client: function(url, protocols) { + var klass, ws; + if (protocols == null) { + protocols = ['v10.stomp', 'v11.stomp']; + } + klass = Stomp.WebSocketClass || WebSocket; + ws = new klass(url, protocols); + return new Client(ws); + }, + over: function(ws) { + return new Client(ws); + }, + Frame: Frame + }; + + if (typeof exports !== "undefined" && exports !== null) { + exports.Stomp = Stomp; + } + + if (typeof window !== "undefined" && window !== null) { + Stomp.setInterval = function(interval, f) { + return window.setInterval(f, interval); + }; + Stomp.clearInterval = function(id) { + return window.clearInterval(id); + }; + window.Stomp = Stomp; + } + + +let data = null; + +let topic = null; +let header = null; +function timedCount(){ + + onmessage = (e) => { + + // data = JSON.parse(e.data); + // // console.log(data); + // if(data.type == 'Simulation_TrainSpeed'){ + // + // }else{ + // postMessage(data); + // } + // + // console.log(e.data); + if(e.data.type == "init"){ + topic = e.data.topic; + header = {'X-Token': e.data.token }; + token = e.data.token; + websocketUrl = e.data.baseurl+'/joylink-websocket?token='; + + } + + if(e.data == "connect"){ + let teststomp = new StompClient(header,token); + teststomp.subscribe(topic, callback, header); + } + + + } + function callback(Response) { + // console.log(Response); + data = JSON.parse(Response.body); + // console.log(data); + if(data.type == 'SJL3D_TrainStatus'){ + for (let i=0,leni = data.body.length; i 1) { + // Make a copy so as not to interfere with a current dispatchEvent. + this._listeners[eventType] = arr.slice(0, idx).concat(arr.slice(idx + 1)); + } else { + delete this._listeners[eventType]; + } + return; + } +}; + +EventTarget.prototype.dispatchEvent = function() { + var event = arguments[0]; + var t = event.type; + // equivalent of Array.prototype.slice.call(arguments, 0); + var args = arguments.length === 1 ? [event] : Array.apply(null, arguments); + // TODO: This doesn't match the real behavior; per spec, onfoo get + // their place in line from the /first/ time they're set from + // non-null. Although WebKit bumps it to the end every time it's + // set. + if (this['on' + t]) { + this['on' + t].apply(this, args); + } + if (t in this._listeners) { + // Grab a reference to the listeners list. removeEventListener may alter the list. + var listeners = this._listeners[t]; + for (var i = 0; i < listeners.length; i++) { + listeners[i].apply(this, args); + } + } +}; + +module.exports = EventTarget; + +},{}],6:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , Event = require('./event') + ; + +function TransportMessageEvent(data) { + Event.call(this); + this.initEvent('message', false, false); + this.data = data; +} + +inherits(TransportMessageEvent, Event); + +module.exports = TransportMessageEvent; + +},{"./event":4,"inherits":57}],7:[function(require,module,exports){ +'use strict'; + +var JSON3 = require('json3') + , iframeUtils = require('./utils/iframe') + ; + +function FacadeJS(transport) { + this._transport = transport; + transport.on('message', this._transportMessage.bind(this)); + transport.on('close', this._transportClose.bind(this)); +} + +FacadeJS.prototype._transportClose = function(code, reason) { + iframeUtils.postMessage('c', JSON3.stringify([code, reason])); +}; +FacadeJS.prototype._transportMessage = function(frame) { + iframeUtils.postMessage('t', frame); +}; +FacadeJS.prototype._send = function(data) { + this._transport.send(data); +}; +FacadeJS.prototype._close = function() { + this._transport.close(); + this._transport.removeAllListeners(); +}; + +module.exports = FacadeJS; + +},{"./utils/iframe":47,"json3":58}],8:[function(require,module,exports){ +(function (process){ +'use strict'; + +var urlUtils = require('./utils/url') + , eventUtils = require('./utils/event') + , JSON3 = require('json3') + , FacadeJS = require('./facade') + , InfoIframeReceiver = require('./info-iframe-receiver') + , iframeUtils = require('./utils/iframe') + , loc = require('./location') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:iframe-bootstrap'); +} + +module.exports = function(SockJS, availableTransports) { + var transportMap = {}; + availableTransports.forEach(function(at) { + if (at.facadeTransport) { + transportMap[at.facadeTransport.transportName] = at.facadeTransport; + } + }); + + // hard-coded for the info iframe + // TODO see if we can make this more dynamic + transportMap[InfoIframeReceiver.transportName] = InfoIframeReceiver; + var parentOrigin; + + /* eslint-disable camelcase */ + SockJS.bootstrap_iframe = function() { + /* eslint-enable camelcase */ + var facade; + iframeUtils.currentWindowId = loc.hash.slice(1); + var onMessage = function(e) { + if (e.source !== parent) { + return; + } + if (typeof parentOrigin === 'undefined') { + parentOrigin = e.origin; + } + if (e.origin !== parentOrigin) { + return; + } + + var iframeMessage; + try { + iframeMessage = JSON3.parse(e.data); + } catch (ignored) { + debug('bad json', e.data); + return; + } + + if (iframeMessage.windowId !== iframeUtils.currentWindowId) { + return; + } + switch (iframeMessage.type) { + case 's': + var p; + try { + p = JSON3.parse(iframeMessage.data); + } catch (ignored) { + debug('bad json', iframeMessage.data); + break; + } + var version = p[0]; + var transport = p[1]; + var transUrl = p[2]; + var baseUrl = p[3]; + debug(version, transport, transUrl, baseUrl); + // change this to semver logic + if (version !== SockJS.version) { + throw new Error('Incompatible SockJS! Main site uses:' + + ' "' + version + '", the iframe:' + + ' "' + SockJS.version + '".'); + } + + if (!urlUtils.isOriginEqual(transUrl, loc.href) || + !urlUtils.isOriginEqual(baseUrl, loc.href)) { + throw new Error('Can\'t connect to different domain from within an ' + + 'iframe. (' + loc.href + ', ' + transUrl + ', ' + baseUrl + ')'); + } + facade = new FacadeJS(new transportMap[transport](transUrl, baseUrl)); + break; + case 'm': + facade._send(iframeMessage.data); + break; + case 'c': + if (facade) { + facade._close(); + } + facade = null; + break; + } + }; + + eventUtils.attachEvent('message', onMessage); + + // Start + iframeUtils.postMessage('s'); + }; +}; + +}).call(this,{ env: {} }) + +},{"./facade":7,"./info-iframe-receiver":10,"./location":13,"./utils/event":46,"./utils/iframe":47,"./utils/url":52,"debug":55,"json3":58}],9:[function(require,module,exports){ +(function (process){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , JSON3 = require('json3') + , objectUtils = require('./utils/object') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:info-ajax'); +} + +function InfoAjax(url, AjaxObject) { + EventEmitter.call(this); + + var self = this; + var t0 = +new Date(); + this.xo = new AjaxObject('GET', url); + + this.xo.once('finish', function(status, text) { + var info, rtt; + if (status === 200) { + rtt = (+new Date()) - t0; + if (text) { + try { + info = JSON3.parse(text); + } catch (e) { + debug('bad json', text); + } + } + + if (!objectUtils.isObject(info)) { + info = {}; + } + } + self.emit('finish', info, rtt); + self.removeAllListeners(); + }); +} + +inherits(InfoAjax, EventEmitter); + +InfoAjax.prototype.close = function() { + this.removeAllListeners(); + this.xo.close(); +}; + +module.exports = InfoAjax; + +}).call(this,{ env: {} }) + +},{"./utils/object":49,"debug":55,"events":3,"inherits":57,"json3":58}],10:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + , JSON3 = require('json3') + , XHRLocalObject = require('./transport/sender/xhr-local') + , InfoAjax = require('./info-ajax') + ; + +function InfoReceiverIframe(transUrl) { + var self = this; + EventEmitter.call(this); + + this.ir = new InfoAjax(transUrl, XHRLocalObject); + this.ir.once('finish', function(info, rtt) { + self.ir = null; + self.emit('message', JSON3.stringify([info, rtt])); + }); +} + +inherits(InfoReceiverIframe, EventEmitter); + +InfoReceiverIframe.transportName = 'iframe-info-receiver'; + +InfoReceiverIframe.prototype.close = function() { + if (this.ir) { + this.ir.close(); + this.ir = null; + } + this.removeAllListeners(); +}; + +module.exports = InfoReceiverIframe; + +},{"./info-ajax":9,"./transport/sender/xhr-local":37,"events":3,"inherits":57,"json3":58}],11:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , JSON3 = require('json3') + , utils = require('./utils/event') + , IframeTransport = require('./transport/iframe') + , InfoReceiverIframe = require('./info-iframe-receiver') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:info-iframe'); +} + +function InfoIframe(baseUrl, url) { + var self = this; + EventEmitter.call(this); + + var go = function() { + var ifr = self.ifr = new IframeTransport(InfoReceiverIframe.transportName, url, baseUrl); + + ifr.once('message', function(msg) { + if (msg) { + var d; + try { + d = JSON3.parse(msg); + } catch (e) { + debug('bad json', msg); + self.emit('finish'); + self.close(); + return; + } + + var info = d[0], rtt = d[1]; + self.emit('finish', info, rtt); + } + self.close(); + }); + + ifr.once('close', function() { + self.emit('finish'); + self.close(); + }); + }; + + // TODO this seems the same as the 'needBody' from transports + if (!global.document.body) { + utils.attachEvent('load', go); + } else { + go(); + } +} + +inherits(InfoIframe, EventEmitter); + +InfoIframe.enabled = function() { + return IframeTransport.enabled(); +}; + +InfoIframe.prototype.close = function() { + if (this.ifr) { + this.ifr.close(); + } + this.removeAllListeners(); + this.ifr = null; +}; + +module.exports = InfoIframe; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./info-iframe-receiver":10,"./transport/iframe":22,"./utils/event":46,"debug":55,"events":3,"inherits":57,"json3":58}],12:[function(require,module,exports){ +(function (process){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , urlUtils = require('./utils/url') + , XDR = require('./transport/sender/xdr') + , XHRCors = require('./transport/sender/xhr-cors') + , XHRLocal = require('./transport/sender/xhr-local') + , XHRFake = require('./transport/sender/xhr-fake') + , InfoIframe = require('./info-iframe') + , InfoAjax = require('./info-ajax') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:info-receiver'); +} + +function InfoReceiver(baseUrl, urlInfo) { + debug(baseUrl); + var self = this; + EventEmitter.call(this); + + setTimeout(function() { + self.doXhr(baseUrl, urlInfo); + }, 0); +} + +inherits(InfoReceiver, EventEmitter); + +// TODO this is currently ignoring the list of available transports and the whitelist + +InfoReceiver._getReceiver = function(baseUrl, url, urlInfo) { + // determine method of CORS support (if needed) + if (urlInfo.sameOrigin) { + return new InfoAjax(url, XHRLocal); + } + if (XHRCors.enabled) { + return new InfoAjax(url, XHRCors); + } + if (XDR.enabled && urlInfo.sameScheme) { + return new InfoAjax(url, XDR); + } + if (InfoIframe.enabled()) { + return new InfoIframe(baseUrl, url); + } + return new InfoAjax(url, XHRFake); +}; + +InfoReceiver.prototype.doXhr = function(baseUrl, urlInfo) { + var self = this + , url = urlUtils.addPath(baseUrl, '/info') + ; + debug('doXhr', url); + + this.xo = InfoReceiver._getReceiver(baseUrl, url, urlInfo); + + this.timeoutRef = setTimeout(function() { + debug('timeout'); + self._cleanup(false); + self.emit('finish'); + }, InfoReceiver.timeout); + + this.xo.once('finish', function(info, rtt) { + debug('finish', info, rtt); + self._cleanup(true); + self.emit('finish', info, rtt); + }); +}; + +InfoReceiver.prototype._cleanup = function(wasClean) { + debug('_cleanup'); + clearTimeout(this.timeoutRef); + this.timeoutRef = null; + if (!wasClean && this.xo) { + this.xo.close(); + } + this.xo = null; +}; + +InfoReceiver.prototype.close = function() { + debug('close'); + this.removeAllListeners(); + this._cleanup(false); +}; + +InfoReceiver.timeout = 8000; + +module.exports = InfoReceiver; + +}).call(this,{ env: {} }) + +},{"./info-ajax":9,"./info-iframe":11,"./transport/sender/xdr":34,"./transport/sender/xhr-cors":35,"./transport/sender/xhr-fake":36,"./transport/sender/xhr-local":37,"./utils/url":52,"debug":55,"events":3,"inherits":57}],13:[function(require,module,exports){ +(function (global){ +'use strict'; + +module.exports = global.location || { + origin: 'http://localhost:80' +, protocol: 'http:' +, host: 'localhost' +, port: 80 +, href: 'http://localhost/' +, hash: '' +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],14:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +require('./shims'); + +var URL = require('url-parse') + , inherits = require('inherits') + , JSON3 = require('json3') + , random = require('./utils/random') + , escape = require('./utils/escape') + , urlUtils = require('./utils/url') + , eventUtils = require('./utils/event') + , transport = require('./utils/transport') + , objectUtils = require('./utils/object') + , browser = require('./utils/browser') + , log = require('./utils/log') + , Event = require('./event/event') + , EventTarget = require('./event/eventtarget') + , loc = require('./location') + , CloseEvent = require('./event/close') + , TransportMessageEvent = require('./event/trans-message') + , InfoReceiver = require('./info-receiver') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:main'); +} + +var transports; + +// follow constructor steps defined at http://dev.w3.org/html5/websockets/#the-websocket-interface +function SockJS(url, protocols, options) { + if (!(this instanceof SockJS)) { + return new SockJS(url, protocols, options); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'SockJS: 1 argument required, but only 0 present"); + } + EventTarget.call(this); + + this.readyState = SockJS.CONNECTING; + this.extensions = ''; + this.protocol = ''; + + // non-standard extension + options = options || {}; + if (options.protocols_whitelist) { + log.warn("'protocols_whitelist' is DEPRECATED. Use 'transports' instead."); + } + this._transportsWhitelist = options.transports; + this._transportOptions = options.transportOptions || {}; + this._timeout = options.timeout || 0; + + var sessionId = options.sessionId || 8; + if (typeof sessionId === 'function') { + this._generateSessionId = sessionId; + } else if (typeof sessionId === 'number') { + this._generateSessionId = function() { + return random.string(sessionId); + }; + } else { + throw new TypeError('If sessionId is used in the options, it needs to be a number or a function.'); + } + + this._server = options.server || random.numberString(1000); + + // Step 1 of WS spec - parse and validate the url. Issue #8 + var parsedUrl = new URL(url); + if (!parsedUrl.host || !parsedUrl.protocol) { + throw new SyntaxError("The URL '" + url + "' is invalid"); + } else if (parsedUrl.hash) { + throw new SyntaxError('The URL must not contain a fragment'); + } else if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:') { + throw new SyntaxError("The URL's scheme must be either 'http:' or 'https:'. '" + parsedUrl.protocol + "' is not allowed."); + } + + var secure = parsedUrl.protocol === 'https:'; + // Step 2 - don't allow secure origin with an insecure protocol + if (loc.protocol === 'https:' && !secure) { + throw new Error('SecurityError: An insecure SockJS connection may not be initiated from a page loaded over HTTPS'); + } + + // Step 3 - check port access - no need here + // Step 4 - parse protocols argument + if (!protocols) { + protocols = []; + } else if (!Array.isArray(protocols)) { + protocols = [protocols]; + } + + // Step 5 - check protocols argument + var sortedProtocols = protocols.sort(); + sortedProtocols.forEach(function(proto, i) { + if (!proto) { + throw new SyntaxError("The protocols entry '" + proto + "' is invalid."); + } + if (i < (sortedProtocols.length - 1) && proto === sortedProtocols[i + 1]) { + throw new SyntaxError("The protocols entry '" + proto + "' is duplicated."); + } + }); + + // Step 6 - convert origin + var o = urlUtils.getOrigin(loc.href); + this._origin = o ? o.toLowerCase() : null; + + // remove the trailing slash + parsedUrl.set('pathname', parsedUrl.pathname.replace(/\/+$/, '')); + + // store the sanitized url + this.url = parsedUrl.href; + debug('using url', this.url); + + // Step 7 - start connection in background + // obtain server info + // http://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html#section-26 + this._urlInfo = { + nullOrigin: !browser.hasDomain() + , sameOrigin: urlUtils.isOriginEqual(this.url, loc.href) + , sameScheme: urlUtils.isSchemeEqual(this.url, loc.href) + }; + + this._ir = new InfoReceiver(this.url, this._urlInfo); + this._ir.once('finish', this._receiveInfo.bind(this)); +} + +inherits(SockJS, EventTarget); + +function userSetCode(code) { + return code === 1000 || (code >= 3000 && code <= 4999); +} + +SockJS.prototype.close = function(code, reason) { + // Step 1 + if (code && !userSetCode(code)) { + throw new Error('InvalidAccessError: Invalid code'); + } + // Step 2.4 states the max is 123 bytes, but we are just checking length + if (reason && reason.length > 123) { + throw new SyntaxError('reason argument has an invalid length'); + } + + // Step 3.1 + if (this.readyState === SockJS.CLOSING || this.readyState === SockJS.CLOSED) { + return; + } + + // TODO look at docs to determine how to set this + var wasClean = true; + this._close(code || 1000, reason || 'Normal closure', wasClean); +}; + +SockJS.prototype.send = function(data) { + // #13 - convert anything non-string to string + // TODO this currently turns objects into [object Object] + if (typeof data !== 'string') { + data = '' + data; + } + if (this.readyState === SockJS.CONNECTING) { + throw new Error('InvalidStateError: The connection has not been established yet'); + } + if (this.readyState !== SockJS.OPEN) { + return; + } + this._transport.send(escape.quote(data)); +}; + +SockJS.version = require('./version'); + +SockJS.CONNECTING = 0; +SockJS.OPEN = 1; +SockJS.CLOSING = 2; +SockJS.CLOSED = 3; + +SockJS.prototype._receiveInfo = function(info, rtt) { + debug('_receiveInfo', rtt); + this._ir = null; + if (!info) { + this._close(1002, 'Cannot connect to server'); + return; + } + + // establish a round-trip timeout (RTO) based on the + // round-trip time (RTT) + this._rto = this.countRTO(rtt); + // allow server to override url used for the actual transport + this._transUrl = info.base_url ? info.base_url : this.url; + info = objectUtils.extend(info, this._urlInfo); + debug('info', info); + // determine list of desired and supported transports + var enabledTransports = transports.filterToEnabled(this._transportsWhitelist, info); + this._transports = enabledTransports.main; + debug(this._transports.length + ' enabled transports'); + + this._connect(); +}; + +SockJS.prototype._connect = function() { + for (var Transport = this._transports.shift(); Transport; Transport = this._transports.shift()) { + debug('attempt', Transport.transportName); + if (Transport.needBody) { + if (!global.document.body || + (typeof global.document.readyState !== 'undefined' && + global.document.readyState !== 'complete' && + global.document.readyState !== 'interactive')) { + debug('waiting for body'); + this._transports.unshift(Transport); + eventUtils.attachEvent('load', this._connect.bind(this)); + return; + } + } + + // calculate timeout based on RTO and round trips. Default to 5s + var timeoutMs = Math.max(this._timeout, (this._rto * Transport.roundTrips) || 5000); + this._transportTimeoutId = setTimeout(this._transportTimeout.bind(this), timeoutMs); + debug('using timeout', timeoutMs); + + var transportUrl = urlUtils.addPath(this._transUrl, '/' + this._server + '/' + this._generateSessionId()); + var options = this._transportOptions[Transport.transportName]; + debug('transport url', transportUrl); + var transportObj = new Transport(transportUrl, this._transUrl, options); + transportObj.on('message', this._transportMessage.bind(this)); + transportObj.once('close', this._transportClose.bind(this)); + transportObj.transportName = Transport.transportName; + this._transport = transportObj; + + return; + } + this._close(2000, 'All transports failed', false); +}; + +SockJS.prototype._transportTimeout = function() { + debug('_transportTimeout'); + if (this.readyState === SockJS.CONNECTING) { + if (this._transport) { + this._transport.close(); + } + + this._transportClose(2007, 'Transport timed out'); + } +}; + +SockJS.prototype._transportMessage = function(msg) { + debug('_transportMessage', msg); + var self = this + , type = msg.slice(0, 1) + , content = msg.slice(1) + , payload + ; + + // first check for messages that don't need a payload + switch (type) { + case 'o': + this._open(); + return; + case 'h': + this.dispatchEvent(new Event('heartbeat')); + debug('heartbeat', this.transport); + return; + } + + if (content) { + try { + payload = JSON3.parse(content); + } catch (e) { + debug('bad json', content); + } + } + + if (typeof payload === 'undefined') { + debug('empty payload', content); + return; + } + + switch (type) { + case 'a': + if (Array.isArray(payload)) { + payload.forEach(function(p) { + debug('message', self.transport, p); + self.dispatchEvent(new TransportMessageEvent(p)); + }); + } + break; + case 'm': + debug('message', this.transport, payload); + this.dispatchEvent(new TransportMessageEvent(payload)); + break; + case 'c': + if (Array.isArray(payload) && payload.length === 2) { + this._close(payload[0], payload[1], true); + } + break; + } +}; + +SockJS.prototype._transportClose = function(code, reason) { + debug('_transportClose', this.transport, code, reason); + if (this._transport) { + this._transport.removeAllListeners(); + this._transport = null; + this.transport = null; + } + + if (!userSetCode(code) && code !== 2000 && this.readyState === SockJS.CONNECTING) { + this._connect(); + return; + } + + this._close(code, reason); +}; + +SockJS.prototype._open = function() { + debug('_open', this._transport && this._transport.transportName, this.readyState); + if (this.readyState === SockJS.CONNECTING) { + if (this._transportTimeoutId) { + clearTimeout(this._transportTimeoutId); + this._transportTimeoutId = null; + } + this.readyState = SockJS.OPEN; + this.transport = this._transport.transportName; + this.dispatchEvent(new Event('open')); + debug('connected', this.transport); + } else { + // The server might have been restarted, and lost track of our + // connection. + this._close(1006, 'Server lost session'); + } +}; + +SockJS.prototype._close = function(code, reason, wasClean) { + debug('_close', this.transport, code, reason, wasClean, this.readyState); + var forceFail = false; + + if (this._ir) { + forceFail = true; + this._ir.close(); + this._ir = null; + } + if (this._transport) { + this._transport.close(); + this._transport = null; + this.transport = null; + } + + if (this.readyState === SockJS.CLOSED) { + throw new Error('InvalidStateError: SockJS has already been closed'); + } + + this.readyState = SockJS.CLOSING; + setTimeout(function() { + this.readyState = SockJS.CLOSED; + + if (forceFail) { + this.dispatchEvent(new Event('error')); + } + + var e = new CloseEvent('close'); + e.wasClean = wasClean || false; + e.code = code || 1000; + e.reason = reason; + + this.dispatchEvent(e); + this.onmessage = this.onclose = this.onerror = null; + debug('disconnected'); + }.bind(this), 0); +}; + +// See: http://www.erg.abdn.ac.uk/~gerrit/dccp/notes/ccid2/rto_estimator/ +// and RFC 2988. +SockJS.prototype.countRTO = function(rtt) { + // In a local environment, when using IE8/9 and the `jsonp-polling` + // transport the time needed to establish a connection (the time that pass + // from the opening of the transport to the call of `_dispatchOpen`) is + // around 200msec (the lower bound used in the article above) and this + // causes spurious timeouts. For this reason we calculate a value slightly + // larger than that used in the article. + if (rtt > 100) { + return 4 * rtt; // rto > 400msec + } + return 300 + rtt; // 300msec < rto <= 400msec +}; + +module.exports = function(availableTransports) { + transports = transport(availableTransports); + require('./iframe-bootstrap')(SockJS, availableTransports); + return SockJS; +}; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./event/close":2,"./event/event":4,"./event/eventtarget":5,"./event/trans-message":6,"./iframe-bootstrap":8,"./info-receiver":12,"./location":13,"./shims":15,"./utils/browser":44,"./utils/escape":45,"./utils/event":46,"./utils/log":48,"./utils/object":49,"./utils/random":50,"./utils/transport":51,"./utils/url":52,"./version":53,"debug":55,"inherits":57,"json3":58,"url-parse":61}],15:[function(require,module,exports){ +/* eslint-disable */ +/* jscs: disable */ +'use strict'; + +// pulled specific shims from https://github.com/es-shims/es5-shim + +var ArrayPrototype = Array.prototype; +var ObjectPrototype = Object.prototype; +var FunctionPrototype = Function.prototype; +var StringPrototype = String.prototype; +var array_slice = ArrayPrototype.slice; + +var _toString = ObjectPrototype.toString; +var isFunction = function (val) { + return ObjectPrototype.toString.call(val) === '[object Function]'; +}; +var isArray = function isArray(obj) { + return _toString.call(obj) === '[object Array]'; +}; +var isString = function isString(obj) { + return _toString.call(obj) === '[object String]'; +}; + +var supportsDescriptors = Object.defineProperty && (function () { + try { + Object.defineProperty({}, 'x', {}); + return true; + } catch (e) { /* this is ES3 */ + return false; + } +}()); + +// Define configurable, writable and non-enumerable props +// if they don't exist. +var defineProperty; +if (supportsDescriptors) { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + Object.defineProperty(object, name, { + configurable: true, + enumerable: false, + writable: true, + value: method + }); + }; +} else { + defineProperty = function (object, name, method, forceAssign) { + if (!forceAssign && (name in object)) { return; } + object[name] = method; + }; +} +var defineProperties = function (object, map, forceAssign) { + for (var name in map) { + if (ObjectPrototype.hasOwnProperty.call(map, name)) { + defineProperty(object, name, map[name], forceAssign); + } + } +}; + +var toObject = function (o) { + if (o == null) { // this matches both null and undefined + throw new TypeError("can't convert " + o + ' to object'); + } + return Object(o); +}; + +// +// Util +// ====== +// + +// ES5 9.4 +// http://es5.github.com/#x9.4 +// http://jsperf.com/to-integer + +function toInteger(num) { + var n = +num; + if (n !== n) { // isNaN + n = 0; + } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) { + n = (n > 0 || -1) * Math.floor(Math.abs(n)); + } + return n; +} + +function ToUint32(x) { + return x >>> 0; +} + +// +// Function +// ======== +// + +// ES-5 15.3.4.5 +// http://es5.github.com/#x15.3.4.5 + +function Empty() {} + +defineProperties(FunctionPrototype, { + bind: function bind(that) { // .length is 1 + // 1. Let Target be the this value. + var target = this; + // 2. If IsCallable(Target) is false, throw a TypeError exception. + if (!isFunction(target)) { + throw new TypeError('Function.prototype.bind called on incompatible ' + target); + } + // 3. Let A be a new (possibly empty) internal list of all of the + // argument values provided after thisArg (arg1, arg2 etc), in order. + // XXX slicedArgs will stand in for "A" if used + var args = array_slice.call(arguments, 1); // for normal call + // 4. Let F be a new native ECMAScript object. + // 11. Set the [[Prototype]] internal property of F to the standard + // built-in Function prototype object as specified in 15.3.3.1. + // 12. Set the [[Call]] internal property of F as described in + // 15.3.4.5.1. + // 13. Set the [[Construct]] internal property of F as described in + // 15.3.4.5.2. + // 14. Set the [[HasInstance]] internal property of F as described in + // 15.3.4.5.3. + var binder = function () { + + if (this instanceof bound) { + // 15.3.4.5.2 [[Construct]] + // When the [[Construct]] internal method of a function object, + // F that was created using the bind function is called with a + // list of arguments ExtraArgs, the following steps are taken: + // 1. Let target be the value of F's [[TargetFunction]] + // internal property. + // 2. If target has no [[Construct]] internal method, a + // TypeError exception is thrown. + // 3. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Construct]] internal + // method of target providing args as the arguments. + + var result = target.apply( + this, + args.concat(array_slice.call(arguments)) + ); + if (Object(result) === result) { + return result; + } + return this; + + } else { + // 15.3.4.5.1 [[Call]] + // When the [[Call]] internal method of a function object, F, + // which was created using the bind function is called with a + // this value and a list of arguments ExtraArgs, the following + // steps are taken: + // 1. Let boundArgs be the value of F's [[BoundArgs]] internal + // property. + // 2. Let boundThis be the value of F's [[BoundThis]] internal + // property. + // 3. Let target be the value of F's [[TargetFunction]] internal + // property. + // 4. Let args be a new list containing the same values as the + // list boundArgs in the same order followed by the same + // values as the list ExtraArgs in the same order. + // 5. Return the result of calling the [[Call]] internal method + // of target providing boundThis as the this value and + // providing args as the arguments. + + // equiv: target.call(this, ...boundArgs, ...args) + return target.apply( + that, + args.concat(array_slice.call(arguments)) + ); + + } + + }; + + // 15. If the [[Class]] internal property of Target is "Function", then + // a. Let L be the length property of Target minus the length of A. + // b. Set the length own property of F to either 0 or L, whichever is + // larger. + // 16. Else set the length own property of F to 0. + + var boundLength = Math.max(0, target.length - args.length); + + // 17. Set the attributes of the length own property of F to the values + // specified in 15.3.5.1. + var boundArgs = []; + for (var i = 0; i < boundLength; i++) { + boundArgs.push('$' + i); + } + + // XXX Build a dynamic function with desired amount of arguments is the only + // way to set the length property of a function. + // In environments where Content Security Policies enabled (Chrome extensions, + // for ex.) all use of eval or Function costructor throws an exception. + // However in all of these environments Function.prototype.bind exists + // and so this code will never be executed. + var bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder); + + if (target.prototype) { + Empty.prototype = target.prototype; + bound.prototype = new Empty(); + // Clean up dangling references. + Empty.prototype = null; + } + + // TODO + // 18. Set the [[Extensible]] internal property of F to true. + + // TODO + // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3). + // 20. Call the [[DefineOwnProperty]] internal method of F with + // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]: + // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and + // false. + // 21. Call the [[DefineOwnProperty]] internal method of F with + // arguments "arguments", PropertyDescriptor {[[Get]]: thrower, + // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false}, + // and false. + + // TODO + // NOTE Function objects created using Function.prototype.bind do not + // have a prototype property or the [[Code]], [[FormalParameters]], and + // [[Scope]] internal properties. + // XXX can't delete prototype in pure-js. + + // 22. Return F. + return bound; + } +}); + +// +// Array +// ===== +// + +// ES5 15.4.3.2 +// http://es5.github.com/#x15.4.3.2 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray +defineProperties(Array, { isArray: isArray }); + + +var boxedString = Object('a'); +var splitString = boxedString[0] !== 'a' || !(0 in boxedString); + +var properlyBoxesContext = function properlyBoxed(method) { + // Check node 0.6.21 bug where third parameter is not boxed + var properlyBoxesNonStrict = true; + var properlyBoxesStrict = true; + if (method) { + method.call('foo', function (_, __, context) { + if (typeof context !== 'object') { properlyBoxesNonStrict = false; } + }); + + method.call([1], function () { + 'use strict'; + properlyBoxesStrict = typeof this === 'string'; + }, 'x'); + } + return !!method && properlyBoxesNonStrict && properlyBoxesStrict; +}; + +defineProperties(ArrayPrototype, { + forEach: function forEach(fun /*, thisp*/) { + var object = toObject(this), + self = splitString && isString(this) ? this.split('') : object, + thisp = arguments[1], + i = -1, + length = self.length >>> 0; + + // If no callback function or if callback is not a callable function + if (!isFunction(fun)) { + throw new TypeError(); // TODO message + } + + while (++i < length) { + if (i in self) { + // Invoke the callback function with call, passing arguments: + // context, property value, property key, thisArg object + // context + fun.call(thisp, self[i], i, object); + } + } + } +}, !properlyBoxesContext(ArrayPrototype.forEach)); + +// ES5 15.4.4.14 +// http://es5.github.com/#x15.4.4.14 +// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf +var hasFirefox2IndexOfBug = Array.prototype.indexOf && [0, 1].indexOf(1, 2) !== -1; +defineProperties(ArrayPrototype, { + indexOf: function indexOf(sought /*, fromIndex */ ) { + var self = splitString && isString(this) ? this.split('') : toObject(this), + length = self.length >>> 0; + + if (!length) { + return -1; + } + + var i = 0; + if (arguments.length > 1) { + i = toInteger(arguments[1]); + } + + // handle negative indices + i = i >= 0 ? i : Math.max(0, length + i); + for (; i < length; i++) { + if (i in self && self[i] === sought) { + return i; + } + } + return -1; + } +}, hasFirefox2IndexOfBug); + +// +// String +// ====== +// + +// ES5 15.5.4.14 +// http://es5.github.com/#x15.5.4.14 + +// [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers] +// Many browsers do not split properly with regular expressions or they +// do not perform the split correctly under obscure conditions. +// See http://blog.stevenlevithan.com/archives/cross-browser-split +// I've tested in many browsers and this seems to cover the deviant ones: +// 'ab'.split(/(?:ab)*/) should be ["", ""], not [""] +// '.'.split(/(.?)(.?)/) should be ["", ".", "", ""], not ["", ""] +// 'tesst'.split(/(s)*/) should be ["t", undefined, "e", "s", "t"], not +// [undefined, "t", undefined, "e", ...] +// ''.split(/.?/) should be [], not [""] +// '.'.split(/()()/) should be ["."], not ["", "", "."] + +var string_split = StringPrototype.split; +if ( + 'ab'.split(/(?:ab)*/).length !== 2 || + '.'.split(/(.?)(.?)/).length !== 4 || + 'tesst'.split(/(s)*/)[1] === 't' || + 'test'.split(/(?:)/, -1).length !== 4 || + ''.split(/.?/).length || + '.'.split(/()()/).length > 1 +) { + (function () { + var compliantExecNpcg = /()??/.exec('')[1] === void 0; // NPCG: nonparticipating capturing group + + StringPrototype.split = function (separator, limit) { + var string = this; + if (separator === void 0 && limit === 0) { + return []; + } + + // If `separator` is not a regex, use native split + if (_toString.call(separator) !== '[object RegExp]') { + return string_split.call(this, separator, limit); + } + + var output = [], + flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.extended ? 'x' : '') + // Proposed for ES6 + (separator.sticky ? 'y' : ''), // Firefox 3+ + lastLastIndex = 0, + // Make `global` and avoid `lastIndex` issues by working with a copy + separator2, match, lastIndex, lastLength; + separator = new RegExp(separator.source, flags + 'g'); + string += ''; // Type-convert + if (!compliantExecNpcg) { + // Doesn't need flags gy, but they don't hurt + separator2 = new RegExp('^' + separator.source + '$(?!\\s)', flags); + } + /* Values for `limit`, per the spec: + * If undefined: 4294967295 // Math.pow(2, 32) - 1 + * If 0, Infinity, or NaN: 0 + * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; + * If negative number: 4294967296 - Math.floor(Math.abs(limit)) + * If other: Type-convert, then use the above rules + */ + limit = limit === void 0 ? + -1 >>> 0 : // Math.pow(2, 32) - 1 + ToUint32(limit); + while (match = separator.exec(string)) { + // `separator.lastIndex` is not reliable cross-browser + lastIndex = match.index + match[0].length; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + // Fix browsers whose `exec` methods don't consistently return `undefined` for + // nonparticipating capturing groups + if (!compliantExecNpcg && match.length > 1) { + match[0].replace(separator2, function () { + for (var i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === void 0) { + match[i] = void 0; + } + } + }); + } + if (match.length > 1 && match.index < string.length) { + ArrayPrototype.push.apply(output, match.slice(1)); + } + lastLength = match[0].length; + lastLastIndex = lastIndex; + if (output.length >= limit) { + break; + } + } + if (separator.lastIndex === match.index) { + separator.lastIndex++; // Avoid an infinite loop + } + } + if (lastLastIndex === string.length) { + if (lastLength || !separator.test('')) { + output.push(''); + } + } else { + output.push(string.slice(lastLastIndex)); + } + return output.length > limit ? output.slice(0, limit) : output; + }; + }()); + +// [bugfix, chrome] +// If separator is undefined, then the result array contains just one String, +// which is the this value (converted to a String). If limit is not undefined, +// then the output array is truncated so that it contains no more than limit +// elements. +// "0".split(undefined, 0) -> [] +} else if ('0'.split(void 0, 0).length) { + StringPrototype.split = function split(separator, limit) { + if (separator === void 0 && limit === 0) { return []; } + return string_split.call(this, separator, limit); + }; +} + +// ECMA-262, 3rd B.2.3 +// Not an ECMAScript standard, although ECMAScript 3rd Edition has a +// non-normative section suggesting uniform semantics and it should be +// normalized across all browsers +// [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE +var string_substr = StringPrototype.substr; +var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b'; +defineProperties(StringPrototype, { + substr: function substr(start, length) { + return string_substr.call( + this, + start < 0 ? ((start = this.length + start) < 0 ? 0 : start) : start, + length + ); + } +}, hasNegativeSubstrBug); + +},{}],16:[function(require,module,exports){ +'use strict'; + +module.exports = [ + // streaming transports + require('./transport/websocket') +, require('./transport/xhr-streaming') +, require('./transport/xdr-streaming') +, require('./transport/eventsource') +, require('./transport/lib/iframe-wrap')(require('./transport/eventsource')) + + // polling transports +, require('./transport/htmlfile') +, require('./transport/lib/iframe-wrap')(require('./transport/htmlfile')) +, require('./transport/xhr-polling') +, require('./transport/xdr-polling') +, require('./transport/lib/iframe-wrap')(require('./transport/xhr-polling')) +, require('./transport/jsonp-polling') +]; + +},{"./transport/eventsource":20,"./transport/htmlfile":21,"./transport/jsonp-polling":23,"./transport/lib/iframe-wrap":26,"./transport/websocket":38,"./transport/xdr-polling":39,"./transport/xdr-streaming":40,"./transport/xhr-polling":41,"./transport/xhr-streaming":42}],17:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var EventEmitter = require('events').EventEmitter + , inherits = require('inherits') + , utils = require('../../utils/event') + , urlUtils = require('../../utils/url') + , XHR = global.XMLHttpRequest + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:browser:xhr'); +} + +function AbstractXHRObject(method, url, payload, opts) { + debug(method, url); + var self = this; + EventEmitter.call(this); + + setTimeout(function () { + self._start(method, url, payload, opts); + }, 0); +} + +inherits(AbstractXHRObject, EventEmitter); + +AbstractXHRObject.prototype._start = function(method, url, payload, opts) { + var self = this; + + try { + this.xhr = new XHR(); + } catch (x) { + // intentionally empty + } + + if (!this.xhr) { + debug('no xhr'); + this.emit('finish', 0, 'no xhr support'); + this._cleanup(); + return; + } + + // several browsers cache POSTs + url = urlUtils.addQuery(url, 't=' + (+new Date())); + + // Explorer tends to keep connection open, even after the + // tab gets closed: http://bugs.jquery.com/ticket/5280 + this.unloadRef = utils.unloadAdd(function() { + debug('unload cleanup'); + self._cleanup(true); + }); + try { + this.xhr.open(method, url, true); + if (this.timeout && 'timeout' in this.xhr) { + this.xhr.timeout = this.timeout; + this.xhr.ontimeout = function() { + debug('xhr timeout'); + self.emit('finish', 0, ''); + self._cleanup(false); + }; + } + } catch (e) { + debug('exception', e); + // IE raises an exception on wrong port. + this.emit('finish', 0, ''); + this._cleanup(false); + return; + } + + if ((!opts || !opts.noCredentials) && AbstractXHRObject.supportsCORS) { + debug('withCredentials'); + // Mozilla docs says https://developer.mozilla.org/en/XMLHttpRequest : + // "This never affects same-site requests." + + this.xhr.withCredentials = true; + } + if (opts && opts.headers) { + for (var key in opts.headers) { + this.xhr.setRequestHeader(key, opts.headers[key]); + } + } + + this.xhr.onreadystatechange = function() { + if (self.xhr) { + var x = self.xhr; + var text, status; + debug('readyState', x.readyState); + switch (x.readyState) { + case 3: + // IE doesn't like peeking into responseText or status + // on Microsoft.XMLHTTP and readystate=3 + try { + status = x.status; + text = x.responseText; + } catch (e) { + // intentionally empty + } + debug('status', status); + // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450 + if (status === 1223) { + status = 204; + } + + // IE does return readystate == 3 for 404 answers. + if (status === 200 && text && text.length > 0) { + debug('chunk'); + self.emit('chunk', status, text); + } + break; + case 4: + status = x.status; + debug('status', status); + // IE returns 1223 for 204: http://bugs.jquery.com/ticket/1450 + if (status === 1223) { + status = 204; + } + // IE returns this for a bad port + // http://msdn.microsoft.com/en-us/library/windows/desktop/aa383770(v=vs.85).aspx + if (status === 12005 || status === 12029) { + status = 0; + } + + debug('finish', status, x.responseText); + self.emit('finish', status, x.responseText); + self._cleanup(false); + break; + } + } + }; + + try { + self.xhr.send(payload); + } catch (e) { + self.emit('finish', 0, ''); + self._cleanup(false); + } +}; + +AbstractXHRObject.prototype._cleanup = function(abort) { + debug('cleanup'); + if (!this.xhr) { + return; + } + this.removeAllListeners(); + utils.unloadDel(this.unloadRef); + + // IE needs this field to be a function + this.xhr.onreadystatechange = function() {}; + if (this.xhr.ontimeout) { + this.xhr.ontimeout = null; + } + + if (abort) { + try { + this.xhr.abort(); + } catch (x) { + // intentionally empty + } + } + this.unloadRef = this.xhr = null; +}; + +AbstractXHRObject.prototype.close = function() { + debug('close'); + this._cleanup(true); +}; + +AbstractXHRObject.enabled = !!XHR; +// override XMLHttpRequest for IE6/7 +// obfuscate to avoid firewalls +var axo = ['Active'].concat('Object').join('X'); +if (!AbstractXHRObject.enabled && (axo in global)) { + debug('overriding xmlhttprequest'); + XHR = function() { + try { + return new global[axo]('Microsoft.XMLHTTP'); + } catch (e) { + return null; + } + }; + AbstractXHRObject.enabled = !!new XHR(); +} + +var cors = false; +try { + cors = 'withCredentials' in new XHR(); +} catch (ignored) { + // intentionally empty +} + +AbstractXHRObject.supportsCORS = cors; + +module.exports = AbstractXHRObject; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/event":46,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],18:[function(require,module,exports){ +(function (global){ +module.exports = global.EventSource; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],19:[function(require,module,exports){ +(function (global){ +'use strict'; + +var Driver = global.WebSocket || global.MozWebSocket; +if (Driver) { + module.exports = function WebSocketBrowserDriver(url) { + return new Driver(url); + }; +} else { + module.exports = undefined; +} + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],20:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , AjaxBasedTransport = require('./lib/ajax-based') + , EventSourceReceiver = require('./receiver/eventsource') + , XHRCorsObject = require('./sender/xhr-cors') + , EventSourceDriver = require('eventsource') + ; + +function EventSourceTransport(transUrl) { + if (!EventSourceTransport.enabled()) { + throw new Error('Transport created when disabled'); + } + + AjaxBasedTransport.call(this, transUrl, '/eventsource', EventSourceReceiver, XHRCorsObject); +} + +inherits(EventSourceTransport, AjaxBasedTransport); + +EventSourceTransport.enabled = function() { + return !!EventSourceDriver; +}; + +EventSourceTransport.transportName = 'eventsource'; +EventSourceTransport.roundTrips = 2; + +module.exports = EventSourceTransport; + +},{"./lib/ajax-based":24,"./receiver/eventsource":29,"./sender/xhr-cors":35,"eventsource":18,"inherits":57}],21:[function(require,module,exports){ +'use strict'; + +var inherits = require('inherits') + , HtmlfileReceiver = require('./receiver/htmlfile') + , XHRLocalObject = require('./sender/xhr-local') + , AjaxBasedTransport = require('./lib/ajax-based') + ; + +function HtmlFileTransport(transUrl) { + if (!HtmlfileReceiver.enabled) { + throw new Error('Transport created when disabled'); + } + AjaxBasedTransport.call(this, transUrl, '/htmlfile', HtmlfileReceiver, XHRLocalObject); +} + +inherits(HtmlFileTransport, AjaxBasedTransport); + +HtmlFileTransport.enabled = function(info) { + return HtmlfileReceiver.enabled && info.sameOrigin; +}; + +HtmlFileTransport.transportName = 'htmlfile'; +HtmlFileTransport.roundTrips = 2; + +module.exports = HtmlFileTransport; + +},{"./lib/ajax-based":24,"./receiver/htmlfile":30,"./sender/xhr-local":37,"inherits":57}],22:[function(require,module,exports){ +(function (process){ +'use strict'; + +// Few cool transports do work only for same-origin. In order to make +// them work cross-domain we shall use iframe, served from the +// remote domain. New browsers have capabilities to communicate with +// cross domain iframe using postMessage(). In IE it was implemented +// from IE 8+, but of course, IE got some details wrong: +// http://msdn.microsoft.com/en-us/library/cc197015(v=VS.85).aspx +// http://stevesouders.com/misc/test-postmessage.php + +var inherits = require('inherits') + , JSON3 = require('json3') + , EventEmitter = require('events').EventEmitter + , version = require('../version') + , urlUtils = require('../utils/url') + , iframeUtils = require('../utils/iframe') + , eventUtils = require('../utils/event') + , random = require('../utils/random') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:transport:iframe'); +} + +function IframeTransport(transport, transUrl, baseUrl) { + if (!IframeTransport.enabled()) { + throw new Error('Transport created when disabled'); + } + EventEmitter.call(this); + + var self = this; + this.origin = urlUtils.getOrigin(baseUrl); + this.baseUrl = baseUrl; + this.transUrl = transUrl; + this.transport = transport; + this.windowId = random.string(8); + + var iframeUrl = urlUtils.addPath(baseUrl, '/iframe.html') + '#' + this.windowId; + debug(transport, transUrl, iframeUrl); + + this.iframeObj = iframeUtils.createIframe(iframeUrl, function(r) { + debug('err callback'); + self.emit('close', 1006, 'Unable to load an iframe (' + r + ')'); + self.close(); + }); + + this.onmessageCallback = this._message.bind(this); + eventUtils.attachEvent('message', this.onmessageCallback); +} + +inherits(IframeTransport, EventEmitter); + +IframeTransport.prototype.close = function() { + debug('close'); + this.removeAllListeners(); + if (this.iframeObj) { + eventUtils.detachEvent('message', this.onmessageCallback); + try { + // When the iframe is not loaded, IE raises an exception + // on 'contentWindow'. + this.postMessage('c'); + } catch (x) { + // intentionally empty + } + this.iframeObj.cleanup(); + this.iframeObj = null; + this.onmessageCallback = this.iframeObj = null; + } +}; + +IframeTransport.prototype._message = function(e) { + debug('message', e.data); + if (!urlUtils.isOriginEqual(e.origin, this.origin)) { + debug('not same origin', e.origin, this.origin); + return; + } + + var iframeMessage; + try { + iframeMessage = JSON3.parse(e.data); + } catch (ignored) { + debug('bad json', e.data); + return; + } + + if (iframeMessage.windowId !== this.windowId) { + debug('mismatched window id', iframeMessage.windowId, this.windowId); + return; + } + + switch (iframeMessage.type) { + case 's': + this.iframeObj.loaded(); + // window global dependency + this.postMessage('s', JSON3.stringify([ + version + , this.transport + , this.transUrl + , this.baseUrl + ])); + break; + case 't': + this.emit('message', iframeMessage.data); + break; + case 'c': + var cdata; + try { + cdata = JSON3.parse(iframeMessage.data); + } catch (ignored) { + debug('bad json', iframeMessage.data); + return; + } + this.emit('close', cdata[0], cdata[1]); + this.close(); + break; + } +}; + +IframeTransport.prototype.postMessage = function(type, data) { + debug('postMessage', type, data); + this.iframeObj.post(JSON3.stringify({ + windowId: this.windowId + , type: type + , data: data || '' + }), this.origin); +}; + +IframeTransport.prototype.send = function(message) { + debug('send', message); + this.postMessage('m', message); +}; + +IframeTransport.enabled = function() { + return iframeUtils.iframeEnabled; +}; + +IframeTransport.transportName = 'iframe'; +IframeTransport.roundTrips = 2; + +module.exports = IframeTransport; + +}).call(this,{ env: {} }) + +},{"../utils/event":46,"../utils/iframe":47,"../utils/random":50,"../utils/url":52,"../version":53,"debug":55,"events":3,"inherits":57,"json3":58}],23:[function(require,module,exports){ +(function (global){ +'use strict'; + +// The simplest and most robust transport, using the well-know cross +// domain hack - JSONP. This transport is quite inefficient - one +// message could use up to one http request. But at least it works almost +// everywhere. +// Known limitations: +// o you will get a spinning cursor +// o for Konqueror a dumb timer is needed to detect errors + +var inherits = require('inherits') + , SenderReceiver = require('./lib/sender-receiver') + , JsonpReceiver = require('./receiver/jsonp') + , jsonpSender = require('./sender/jsonp') + ; + +function JsonPTransport(transUrl) { + if (!JsonPTransport.enabled()) { + throw new Error('Transport created when disabled'); + } + SenderReceiver.call(this, transUrl, '/jsonp', jsonpSender, JsonpReceiver); +} + +inherits(JsonPTransport, SenderReceiver); + +JsonPTransport.enabled = function() { + return !!global.document; +}; + +JsonPTransport.transportName = 'jsonp-polling'; +JsonPTransport.roundTrips = 1; +JsonPTransport.needBody = true; + +module.exports = JsonPTransport; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"./lib/sender-receiver":28,"./receiver/jsonp":31,"./sender/jsonp":33,"inherits":57}],24:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , urlUtils = require('../../utils/url') + , SenderReceiver = require('./sender-receiver') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:ajax-based'); +} + +function createAjaxSender(AjaxObject) { + return function(url, payload, callback) { + debug('create ajax sender', url, payload); + var opt = {}; + if (typeof payload === 'string') { + opt.headers = {'Content-type': 'text/plain'}; + } + var ajaxUrl = urlUtils.addPath(url, '/xhr_send'); + var xo = new AjaxObject('POST', ajaxUrl, payload, opt); + xo.once('finish', function(status) { + debug('finish', status); + xo = null; + + if (status !== 200 && status !== 204) { + return callback(new Error('http status ' + status)); + } + callback(); + }); + return function() { + debug('abort'); + xo.close(); + xo = null; + + var err = new Error('Aborted'); + err.code = 1000; + callback(err); + }; + }; +} + +function AjaxBasedTransport(transUrl, urlSuffix, Receiver, AjaxObject) { + SenderReceiver.call(this, transUrl, urlSuffix, createAjaxSender(AjaxObject), Receiver, AjaxObject); +} + +inherits(AjaxBasedTransport, SenderReceiver); + +module.exports = AjaxBasedTransport; + +}).call(this,{ env: {} }) + +},{"../../utils/url":52,"./sender-receiver":28,"debug":55,"inherits":57}],25:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:buffered-sender'); +} + +function BufferedSender(url, sender) { + debug(url); + EventEmitter.call(this); + this.sendBuffer = []; + this.sender = sender; + this.url = url; +} + +inherits(BufferedSender, EventEmitter); + +BufferedSender.prototype.send = function(message) { + debug('send', message); + this.sendBuffer.push(message); + if (!this.sendStop) { + this.sendSchedule(); + } +}; + +// For polling transports in a situation when in the message callback, +// new message is being send. If the sending connection was started +// before receiving one, it is possible to saturate the network and +// timeout due to the lack of receiving socket. To avoid that we delay +// sending messages by some small time, in order to let receiving +// connection be started beforehand. This is only a halfmeasure and +// does not fix the big problem, but it does make the tests go more +// stable on slow networks. +BufferedSender.prototype.sendScheduleWait = function() { + debug('sendScheduleWait'); + var self = this; + var tref; + this.sendStop = function() { + debug('sendStop'); + self.sendStop = null; + clearTimeout(tref); + }; + tref = setTimeout(function() { + debug('timeout'); + self.sendStop = null; + self.sendSchedule(); + }, 25); +}; + +BufferedSender.prototype.sendSchedule = function() { + debug('sendSchedule', this.sendBuffer.length); + var self = this; + if (this.sendBuffer.length > 0) { + var payload = '[' + this.sendBuffer.join(',') + ']'; + this.sendStop = this.sender(this.url, payload, function(err) { + self.sendStop = null; + if (err) { + debug('error', err); + self.emit('close', err.code || 1006, 'Sending error: ' + err); + self.close(); + } else { + self.sendScheduleWait(); + } + }); + this.sendBuffer = []; + } +}; + +BufferedSender.prototype._cleanup = function() { + debug('_cleanup'); + this.removeAllListeners(); +}; + +BufferedSender.prototype.close = function() { + debug('close'); + this._cleanup(); + if (this.sendStop) { + this.sendStop(); + this.sendStop = null; + } +}; + +module.exports = BufferedSender; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"inherits":57}],26:[function(require,module,exports){ +(function (global){ +'use strict'; + +var inherits = require('inherits') + , IframeTransport = require('../iframe') + , objectUtils = require('../../utils/object') + ; + +module.exports = function(transport) { + + function IframeWrapTransport(transUrl, baseUrl) { + IframeTransport.call(this, transport.transportName, transUrl, baseUrl); + } + + inherits(IframeWrapTransport, IframeTransport); + + IframeWrapTransport.enabled = function(url, info) { + if (!global.document) { + return false; + } + + var iframeInfo = objectUtils.extend({}, info); + iframeInfo.sameOrigin = true; + return transport.enabled(iframeInfo) && IframeTransport.enabled(); + }; + + IframeWrapTransport.transportName = 'iframe-' + transport.transportName; + IframeWrapTransport.needBody = true; + IframeWrapTransport.roundTrips = IframeTransport.roundTrips + transport.roundTrips - 1; // html, javascript (2) + transport - no CORS (1) + + IframeWrapTransport.facadeTransport = transport; + + return IframeWrapTransport; +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/object":49,"../iframe":22,"inherits":57}],27:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:polling'); +} + +function Polling(Receiver, receiveUrl, AjaxObject) { + debug(receiveUrl); + EventEmitter.call(this); + this.Receiver = Receiver; + this.receiveUrl = receiveUrl; + this.AjaxObject = AjaxObject; + this._scheduleReceiver(); +} + +inherits(Polling, EventEmitter); + +Polling.prototype._scheduleReceiver = function() { + debug('_scheduleReceiver'); + var self = this; + var poll = this.poll = new this.Receiver(this.receiveUrl, this.AjaxObject); + + poll.on('message', function(msg) { + debug('message', msg); + self.emit('message', msg); + }); + + poll.once('close', function(code, reason) { + debug('close', code, reason, self.pollIsClosing); + self.poll = poll = null; + + if (!self.pollIsClosing) { + if (reason === 'network') { + self._scheduleReceiver(); + } else { + self.emit('close', code || 1006, reason); + self.removeAllListeners(); + } + } + }); +}; + +Polling.prototype.abort = function() { + debug('abort'); + this.removeAllListeners(); + this.pollIsClosing = true; + if (this.poll) { + this.poll.abort(); + } +}; + +module.exports = Polling; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"inherits":57}],28:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , urlUtils = require('../../utils/url') + , BufferedSender = require('./buffered-sender') + , Polling = require('./polling') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:sender-receiver'); +} + +function SenderReceiver(transUrl, urlSuffix, senderFunc, Receiver, AjaxObject) { + var pollUrl = urlUtils.addPath(transUrl, urlSuffix); + debug(pollUrl); + var self = this; + BufferedSender.call(this, transUrl, senderFunc); + + this.poll = new Polling(Receiver, pollUrl, AjaxObject); + this.poll.on('message', function(msg) { + debug('poll message', msg); + self.emit('message', msg); + }); + this.poll.once('close', function(code, reason) { + debug('poll close', code, reason); + self.poll = null; + self.emit('close', code, reason); + self.close(); + }); +} + +inherits(SenderReceiver, BufferedSender); + +SenderReceiver.prototype.close = function() { + BufferedSender.prototype.close.call(this); + debug('close'); + this.removeAllListeners(); + if (this.poll) { + this.poll.abort(); + this.poll = null; + } +}; + +module.exports = SenderReceiver; + +}).call(this,{ env: {} }) + +},{"../../utils/url":52,"./buffered-sender":25,"./polling":27,"debug":55,"inherits":57}],29:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + , EventSourceDriver = require('eventsource') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:eventsource'); +} + +function EventSourceReceiver(url) { + debug(url); + EventEmitter.call(this); + + var self = this; + var es = this.es = new EventSourceDriver(url); + es.onmessage = function(e) { + debug('message', e.data); + self.emit('message', decodeURI(e.data)); + }; + es.onerror = function(e) { + debug('error', es.readyState, e); + // ES on reconnection has readyState = 0 or 1. + // on network error it's CLOSED = 2 + var reason = (es.readyState !== 2 ? 'network' : 'permanent'); + self._cleanup(); + self._close(reason); + }; +} + +inherits(EventSourceReceiver, EventEmitter); + +EventSourceReceiver.prototype.abort = function() { + debug('abort'); + this._cleanup(); + this._close('user'); +}; + +EventSourceReceiver.prototype._cleanup = function() { + debug('cleanup'); + var es = this.es; + if (es) { + es.onmessage = es.onerror = null; + es.close(); + this.es = null; + } +}; + +EventSourceReceiver.prototype._close = function(reason) { + debug('close', reason); + var self = this; + // Safari and chrome < 15 crash if we close window before + // waiting for ES cleanup. See: + // https://code.google.com/p/chromium/issues/detail?id=89155 + setTimeout(function() { + self.emit('close', null, reason); + self.removeAllListeners(); + }, 200); +}; + +module.exports = EventSourceReceiver; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"eventsource":18,"inherits":57}],30:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var inherits = require('inherits') + , iframeUtils = require('../../utils/iframe') + , urlUtils = require('../../utils/url') + , EventEmitter = require('events').EventEmitter + , random = require('../../utils/random') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:htmlfile'); +} + +function HtmlfileReceiver(url) { + debug(url); + EventEmitter.call(this); + var self = this; + iframeUtils.polluteGlobalNamespace(); + + this.id = 'a' + random.string(6); + url = urlUtils.addQuery(url, 'c=' + decodeURIComponent(iframeUtils.WPrefix + '.' + this.id)); + + debug('using htmlfile', HtmlfileReceiver.htmlfileEnabled); + var constructFunc = HtmlfileReceiver.htmlfileEnabled ? + iframeUtils.createHtmlfile : iframeUtils.createIframe; + + global[iframeUtils.WPrefix][this.id] = { + start: function() { + debug('start'); + self.iframeObj.loaded(); + } + , message: function(data) { + debug('message', data); + self.emit('message', data); + } + , stop: function() { + debug('stop'); + self._cleanup(); + self._close('network'); + } + }; + this.iframeObj = constructFunc(url, function() { + debug('callback'); + self._cleanup(); + self._close('permanent'); + }); +} + +inherits(HtmlfileReceiver, EventEmitter); + +HtmlfileReceiver.prototype.abort = function() { + debug('abort'); + this._cleanup(); + this._close('user'); +}; + +HtmlfileReceiver.prototype._cleanup = function() { + debug('_cleanup'); + if (this.iframeObj) { + this.iframeObj.cleanup(); + this.iframeObj = null; + } + delete global[iframeUtils.WPrefix][this.id]; +}; + +HtmlfileReceiver.prototype._close = function(reason) { + debug('_close', reason); + this.emit('close', null, reason); + this.removeAllListeners(); +}; + +HtmlfileReceiver.htmlfileEnabled = false; + +// obfuscate to avoid firewalls +var axo = ['Active'].concat('Object').join('X'); +if (axo in global) { + try { + HtmlfileReceiver.htmlfileEnabled = !!new global[axo]('htmlfile'); + } catch (x) { + // intentionally empty + } +} + +HtmlfileReceiver.enabled = HtmlfileReceiver.htmlfileEnabled || iframeUtils.iframeEnabled; + +module.exports = HtmlfileReceiver; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/iframe":47,"../../utils/random":50,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],31:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var utils = require('../../utils/iframe') + , random = require('../../utils/random') + , browser = require('../../utils/browser') + , urlUtils = require('../../utils/url') + , inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:jsonp'); +} + +function JsonpReceiver(url) { + debug(url); + var self = this; + EventEmitter.call(this); + + utils.polluteGlobalNamespace(); + + this.id = 'a' + random.string(6); + var urlWithId = urlUtils.addQuery(url, 'c=' + encodeURIComponent(utils.WPrefix + '.' + this.id)); + + global[utils.WPrefix][this.id] = this._callback.bind(this); + this._createScript(urlWithId); + + // Fallback mostly for Konqueror - stupid timer, 35 seconds shall be plenty. + this.timeoutId = setTimeout(function() { + debug('timeout'); + self._abort(new Error('JSONP script loaded abnormally (timeout)')); + }, JsonpReceiver.timeout); +} + +inherits(JsonpReceiver, EventEmitter); + +JsonpReceiver.prototype.abort = function() { + debug('abort'); + if (global[utils.WPrefix][this.id]) { + var err = new Error('JSONP user aborted read'); + err.code = 1000; + this._abort(err); + } +}; + +JsonpReceiver.timeout = 35000; +JsonpReceiver.scriptErrorTimeout = 1000; + +JsonpReceiver.prototype._callback = function(data) { + debug('_callback', data); + this._cleanup(); + + if (this.aborting) { + return; + } + + if (data) { + debug('message', data); + this.emit('message', data); + } + this.emit('close', null, 'network'); + this.removeAllListeners(); +}; + +JsonpReceiver.prototype._abort = function(err) { + debug('_abort', err); + this._cleanup(); + this.aborting = true; + this.emit('close', err.code, err.message); + this.removeAllListeners(); +}; + +JsonpReceiver.prototype._cleanup = function() { + debug('_cleanup'); + clearTimeout(this.timeoutId); + if (this.script2) { + this.script2.parentNode.removeChild(this.script2); + this.script2 = null; + } + if (this.script) { + var script = this.script; + // Unfortunately, you can't really abort script loading of + // the script. + script.parentNode.removeChild(script); + script.onreadystatechange = script.onerror = + script.onload = script.onclick = null; + this.script = null; + } + delete global[utils.WPrefix][this.id]; +}; + +JsonpReceiver.prototype._scriptError = function() { + debug('_scriptError'); + var self = this; + if (this.errorTimer) { + return; + } + + this.errorTimer = setTimeout(function() { + if (!self.loadedOkay) { + self._abort(new Error('JSONP script loaded abnormally (onerror)')); + } + }, JsonpReceiver.scriptErrorTimeout); +}; + +JsonpReceiver.prototype._createScript = function(url) { + debug('_createScript', url); + var self = this; + var script = this.script = global.document.createElement('script'); + var script2; // Opera synchronous load trick. + + script.id = 'a' + random.string(8); + script.src = url; + script.type = 'text/javascript'; + script.charset = 'UTF-8'; + script.onerror = this._scriptError.bind(this); + script.onload = function() { + debug('onload'); + self._abort(new Error('JSONP script loaded abnormally (onload)')); + }; + + // IE9 fires 'error' event after onreadystatechange or before, in random order. + // Use loadedOkay to determine if actually errored + script.onreadystatechange = function() { + debug('onreadystatechange', script.readyState); + if (/loaded|closed/.test(script.readyState)) { + if (script && script.htmlFor && script.onclick) { + self.loadedOkay = true; + try { + // In IE, actually execute the script. + script.onclick(); + } catch (x) { + // intentionally empty + } + } + if (script) { + self._abort(new Error('JSONP script loaded abnormally (onreadystatechange)')); + } + } + }; + // IE: event/htmlFor/onclick trick. + // One can't rely on proper order for onreadystatechange. In order to + // make sure, set a 'htmlFor' and 'event' properties, so that + // script code will be installed as 'onclick' handler for the + // script object. Later, onreadystatechange, manually execute this + // code. FF and Chrome doesn't work with 'event' and 'htmlFor' + // set. For reference see: + // http://jaubourg.net/2010/07/loading-script-as-onclick-handler-of.html + // Also, read on that about script ordering: + // http://wiki.whatwg.org/wiki/Dynamic_Script_Execution_Order + if (typeof script.async === 'undefined' && global.document.attachEvent) { + // According to mozilla docs, in recent browsers script.async defaults + // to 'true', so we may use it to detect a good browser: + // https://developer.mozilla.org/en/HTML/Element/script + if (!browser.isOpera()) { + // Naively assume we're in IE + try { + script.htmlFor = script.id; + script.event = 'onclick'; + } catch (x) { + // intentionally empty + } + script.async = true; + } else { + // Opera, second sync script hack + script2 = this.script2 = global.document.createElement('script'); + script2.text = "try{var a = document.getElementById('" + script.id + "'); if(a)a.onerror();}catch(x){};"; + script.async = script2.async = false; + } + } + if (typeof script.async !== 'undefined') { + script.async = true; + } + + var head = global.document.getElementsByTagName('head')[0]; + head.insertBefore(script, head.firstChild); + if (script2) { + head.insertBefore(script2, head.firstChild); + } +}; + +module.exports = JsonpReceiver; + +}).call(this,{ env: {} },typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{"../../utils/browser":44,"../../utils/iframe":47,"../../utils/random":50,"../../utils/url":52,"debug":55,"events":3,"inherits":57}],32:[function(require,module,exports){ +(function (process){ +'use strict'; + +var inherits = require('inherits') + , EventEmitter = require('events').EventEmitter + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:receiver:xhr'); +} + +function XhrReceiver(url, AjaxObject) { + debug(url); + EventEmitter.call(this); + var self = this; + + this.bufferPosition = 0; + + this.xo = new AjaxObject('POST', url, null); + this.xo.on('chunk', this._chunkHandler.bind(this)); + this.xo.once('finish', function(status, text) { + debug('finish', status, text); + self._chunkHandler(status, text); + self.xo = null; + var reason = status === 200 ? 'network' : 'permanent'; + debug('close', reason); + self.emit('close', null, reason); + self._cleanup(); + }); +} + +inherits(XhrReceiver, EventEmitter); + +XhrReceiver.prototype._chunkHandler = function(status, text) { + debug('_chunkHandler', status); + if (status !== 200 || !text) { + return; + } + + for (var idx = -1; ; this.bufferPosition += idx + 1) { + var buf = text.slice(this.bufferPosition); + idx = buf.indexOf('\n'); + if (idx === -1) { + break; + } + var msg = buf.slice(0, idx); + if (msg) { + debug('message', msg); + this.emit('message', msg); + } + } +}; + +XhrReceiver.prototype._cleanup = function() { + debug('_cleanup'); + this.removeAllListeners(); +}; + +XhrReceiver.prototype.abort = function() { + debug('abort'); + if (this.xo) { + this.xo.close(); + debug('close'); + this.emit('close', null, 'user'); + this.xo = null; + } + this._cleanup(); +}; + +module.exports = XhrReceiver; + +}).call(this,{ env: {} }) + +},{"debug":55,"events":3,"inherits":57}],33:[function(require,module,exports){ +(function (process,global){ +'use strict'; + +var random = require('../../utils/random') + , urlUtils = require('../../utils/url') + ; + +var debug = function() {}; +if (process.env.NODE_ENV !== 'production') { + debug = require('debug')('sockjs-client:sender:jsonp'); +} + +var form, area; + +function createIframe(id) { + debug('createIframe', id); + try { + // ie6 dynamic iframes with target="" support (thanks Chris Lambacher) + return global.document.createElement('