Compare commits
	
		
			2 Commits
		
	
	
		
			8c3ee80b21
			...
			8c8e06b015
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 8c8e06b015 | |||
| d7b6967b6f | 
| @ -2,16 +2,19 @@ body { | ||||
| 	margin: 0; | ||||
| 	padding: 0; | ||||
| 	font-family: sans-serif; | ||||
| 	font-size: clamp(0.5rem, 2vw, 1rem); | ||||
| } | ||||
| .xP { | ||||
| 	height: 100vh; | ||||
| 	display: flex; | ||||
| 	flex-direction: column; | ||||
| 	overflow: hidden; | ||||
| 	height: 100vh; | ||||
| 	/* https://caniuse.com/viewport-unit-variants */ | ||||
| 	height: 100dvh; | ||||
| } | ||||
| 
 | ||||
| .title, .status { | ||||
| 	padding: .05rem .3rem; | ||||
| 	padding: .05em .3em; | ||||
| 	background: #eee; | ||||
| 
 | ||||
| 	position: relative; | ||||
| @ -52,10 +55,11 @@ body { | ||||
| .list { | ||||
| 	overflow-y: auto; | ||||
| 	border-right: 1px solid #ccc; | ||||
| 	min-width: 10rem; | ||||
| 	min-width: 10em; | ||||
| 	flex-shrink: 0; | ||||
| } | ||||
| .item { | ||||
| 	padding: .05rem .3rem; | ||||
| 	padding: .05em .3em; | ||||
| 	cursor: default; | ||||
| } | ||||
| .item.highlighted { | ||||
| @ -89,7 +93,7 @@ body { | ||||
| 	overflow-y: auto; | ||||
| } | ||||
| .log { | ||||
| 	padding: .1rem .3rem; | ||||
| 	padding: .1em .3em; | ||||
| 	font-family: monospace; | ||||
| 	white-space: pre-wrap; | ||||
| 	overflow-y: auto; | ||||
| @ -99,7 +103,7 @@ body { | ||||
| 	opacity: 50%; | ||||
| } | ||||
| .date { | ||||
| 	padding: .3rem; | ||||
| 	padding: .3em; | ||||
| 	grid-column: span 2; | ||||
| 	font-weight: bold; | ||||
| } | ||||
| @ -109,16 +113,16 @@ body { | ||||
| 	background: #ff5f00; | ||||
| } | ||||
| .time { | ||||
| 	padding: .1rem .3rem; | ||||
| 	padding: .1em .3em; | ||||
| 	background: #f8f8f8; | ||||
| 	color: #bbb; | ||||
| 	border-right: 1px solid #ccc; | ||||
| } | ||||
| .mark { | ||||
| 	padding-right: .3rem; | ||||
| 	padding-right: .3em; | ||||
| 	text-align: center; | ||||
| 	display: inline-block; | ||||
| 	min-width: 2rem; | ||||
| 	min-width: 2em; | ||||
| } | ||||
| .mark.error { | ||||
| 	color: red; | ||||
| @ -133,7 +137,7 @@ body { | ||||
| 	color: darkred; | ||||
| } | ||||
| .content { | ||||
| 	padding: .1rem .3rem; | ||||
| 	padding: .1em .3em; | ||||
| 	white-space: pre-wrap; | ||||
| } | ||||
| .content .b { | ||||
| @ -154,7 +158,7 @@ body { | ||||
| 
 | ||||
| textarea { | ||||
| 	font: inherit; | ||||
| 	padding: .05rem .3rem; | ||||
| 	padding: .05em .3em; | ||||
| 	margin: 0; | ||||
| 	border: 2px inset #eee; | ||||
| 	flex-shrink: 0; | ||||
|  | ||||
							
								
								
									
										14
									
								
								xP/xP.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								xP/xP.go
									
									
									
									
									
								
							| @ -22,6 +22,7 @@ import ( | ||||
| var ( | ||||
| 	addressBind    string | ||||
| 	addressConnect string | ||||
| 	addressWS      string | ||||
| ) | ||||
| 
 | ||||
| func clientToRelay( | ||||
| @ -144,6 +145,7 @@ var page = template.Must(template.New("/").Parse(`<!DOCTYPE html> | ||||
| <head> | ||||
| 	<title>xP</title> | ||||
| 	<meta charset="utf-8" /> | ||||
| 	<meta name="viewport" content="width=device-width, initial-scale=1"> | ||||
| 	<link rel="stylesheet" href="xP.css" /> | ||||
| </head> | ||||
| <body> | ||||
| @ -163,18 +165,24 @@ func handleDefault(w http.ResponseWriter, r *http.Request) { | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	wsURI := fmt.Sprintf("ws://%s/ws", r.Host) | ||||
| 	wsURI := addressWS | ||||
| 	if wsURI == "" { | ||||
| 		wsURI = fmt.Sprintf("ws://%s/ws", r.Host) | ||||
| 	} | ||||
| 	if err := page.Execute(w, wsURI); err != nil { | ||||
| 		log.Println("Template execution failed: " + err.Error()) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func main() { | ||||
| 	if len(os.Args) != 3 { | ||||
| 		log.Fatalf("usage: %s BIND CONNECT\n", os.Args[0]) | ||||
| 	if len(os.Args) < 3 || len(os.Args) > 4 { | ||||
| 		log.Fatalf("usage: %s BIND CONNECT [WSURI]\n", os.Args[0]) | ||||
| 	} | ||||
| 
 | ||||
| 	addressBind, addressConnect = os.Args[1], os.Args[2] | ||||
| 	if len(os.Args) > 3 { | ||||
| 		addressWS = os.Args[3] | ||||
| 	} | ||||
| 
 | ||||
| 	http.Handle("/ws", websocket.Handler(handleWebSocket)) | ||||
| 	http.Handle("/", http.HandlerFunc(handleDefault)) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user