forked from icza/gowut
-
Notifications
You must be signed in to change notification settings - Fork 0
/
sess_monitor.go
98 lines (83 loc) · 2.96 KB
/
sess_monitor.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
// Copyright (C) 2013 Andras Belicza. All rights reserved.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
// Session monitor component interface and implementation.
package gwu
import (
"time"
)
// SessMonitor interface defines a component which monitors and displays
// the session timeout and network connectivity at client side without
// interacting with the session.
//
// Default style classes: "gwu-SessMonitor", "gwu-SessMonitor-Expired",
// "gwu-SessMonitor-Error"
type SessMonitor interface {
// SessMonitor is a Timer, but it does not generate Events!
Timer
// SetJsConverter sets the Javascript function name which converts
// a float second time value to a displayable string.
// The default value is "convertSessTimeout" whose implementation is:
// function convertSessTimeout(sec) {
// if (sec <= 0)
// return "Expired!";
// else if (sec < 60)
// return "<1 min";
// else
// return "~" + Math.round(sec / 60) + " min";
// }
SetJsConverter(jsFuncName string)
// JsConverter returns the name of the Javascript function which converts
// float second time values to displayable strings.
JsConverter() string
}
// SessMonitor implementation
type sessMonitorImpl struct {
timerImpl // Timer implementation
}
// NewSessMonitor creates a new SessMonitor.
// By default it is active repeats with 1 minute timeout duration.
func NewSessMonitor() SessMonitor {
c := &sessMonitorImpl{
timerImpl{compImpl: newCompImpl(nil), timeout: time.Minute, active: true, repeat: true},
}
c.Style().AddClass("gwu-SessMonitor")
c.SetJsConverter("convertSessTimeout")
return c
}
func (c *sessMonitorImpl) SetJsConverter(jsFuncName string) {
c.SetAttr("gwuJsFuncName", jsFuncName)
}
func (c *sessMonitorImpl) JsConverter() string {
return c.Attr("gwuJsFuncName")
}
var (
strEmptySpan = []byte("<span></span>") // "<span></span>"
strJsCheckSessOp = []byte("checkSession(") // "checkSession("
)
func (c *sessMonitorImpl) Render(w Writer) {
w.Write(strSpanOp)
c.renderAttrsAndStyle(w)
c.renderEHandlers(w)
w.Write(strGT)
w.Write(strEmptySpan) // Placeholder for session timeout value
w.Write(strScriptOp)
c.renderSetupTimerJs(w, strJsCheckSessOp, int(c.id), strParenCl)
// Call sess check right away:
w.Write(strJsCheckSessOp)
w.Writev(int(c.id))
w.Write(strJsFuncCl)
w.Write(strScriptCl)
w.Write(strSpanCl)
}