|
- /* ----------------------------------------------------------------------
- * ______ ___ __
- * / ____/___ / | ____ __ ___ __/ /_ ___ ________
- * / / __/ __ \/ /| | / __ \/ / / / | /| / / __ \/ _ \/ ___/ _ \
- * / /_/ / /_/ / ___ |/ / / / /_/ /| |/ |/ / / / / __/ / / __/
- * \____/\____/_/ |_/_/ /_/\__. / |__/|__/_/ /_/\___/_/ \___/
- * /____/
- *
- * (C) Copyright 2015 GoAnywhere (http://goanywhere.io).
- * ----------------------------------------------------------------------
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ----------------------------------------------------------------------*/
- package livereload
-
- import (
- "encoding/json"
- "regexp"
-
- "github.com/gorilla/websocket"
- )
-
- var regexHandshake = regexp.MustCompile(`"command"\s*:\s*"hello"`)
-
- /* ----------------------------------------------------------------------
- * WebSocket Server Tunnel
- * ----------------------------------------------------------------------*/
- type tunnel struct {
- socket *websocket.Conn
- message chan []byte
- }
-
- // connect reads/writes message for livereload.js.
- func (self *tunnel) connect() {
- // ***********************
- // WebSocket Tunnel#Write
- // ***********************
- go func() {
- for message := range self.message {
- if err := self.socket.WriteMessage(websocket.TextMessage, message); err != nil {
- break
- } else {
- if regexHandshake.Find(message) != nil {
- // Keep the tunnel opened after handshake(hello command).
- Reload()
- }
- }
- }
- self.socket.Close()
- }()
- // ***********************
- // WebSocket Tunnel#Read
- // ***********************
- for {
- _, message, err := self.socket.ReadMessage()
- if err != nil {
- break
- }
- switch true {
- case regexHandshake.Find(message) != nil:
- var bytes, _ = json.Marshal(&hello{
- Command: "hello",
- Protocols: []string{"http://livereload.com/protocols/official-7"},
- ServerName: "Rex#Livereload",
- })
- self.message <- bytes
- }
- }
- self.socket.Close()
- }
|