1
2
3 package internal
4
5 import (
6 "bytes"
7 "compress/gzip"
8 "encoding/base64"
9 "io/ioutil"
10 "net/http"
11 "os"
12 "path"
13 "sync"
14 "time"
15 )
16
17 type _escLocalFS struct{}
18
19 var _escLocal _escLocalFS
20
21 type _escStaticFS struct{}
22
23 var _escStatic _escStaticFS
24
25 type _escDirectory struct {
26 fs http.FileSystem
27 name string
28 }
29
30 type _escFile struct {
31 compressed string
32 size int64
33 modtime int64
34 local string
35 isDir bool
36
37 once sync.Once
38 data []byte
39 name string
40 }
41
42 func (_escLocalFS) Open(name string) (http.File, error) {
43 f, present := _escData[path.Clean(name)]
44 if !present {
45 return nil, os.ErrNotExist
46 }
47 return os.Open(f.local)
48 }
49
50 func (_escStaticFS) prepare(name string) (*_escFile, error) {
51 f, present := _escData[path.Clean(name)]
52 if !present {
53 return nil, os.ErrNotExist
54 }
55 var err error
56 f.once.Do(func() {
57 f.name = path.Base(name)
58 if f.size == 0 {
59 return
60 }
61 var gr *gzip.Reader
62 b64 := base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(f.compressed))
63 gr, err = gzip.NewReader(b64)
64 if err != nil {
65 return
66 }
67 f.data, err = ioutil.ReadAll(gr)
68 })
69 if err != nil {
70 return nil, err
71 }
72 return f, nil
73 }
74
75 func (fs _escStaticFS) Open(name string) (http.File, error) {
76 f, err := fs.prepare(name)
77 if err != nil {
78 return nil, err
79 }
80 return f.File()
81 }
82
83 func (dir _escDirectory) Open(name string) (http.File, error) {
84 return dir.fs.Open(dir.name + name)
85 }
86
87 func (f *_escFile) File() (http.File, error) {
88 type httpFile struct {
89 *bytes.Reader
90 *_escFile
91 }
92 return &httpFile{
93 Reader: bytes.NewReader(f.data),
94 _escFile: f,
95 }, nil
96 }
97
98 func (f *_escFile) Close() error {
99 return nil
100 }
101
102 func (f *_escFile) Readdir(count int) ([]os.FileInfo, error) {
103 return nil, nil
104 }
105
106 func (f *_escFile) Stat() (os.FileInfo, error) {
107 return f, nil
108 }
109
110 func (f *_escFile) Name() string {
111 return f.name
112 }
113
114 func (f *_escFile) Size() int64 {
115 return f.size
116 }
117
118 func (f *_escFile) Mode() os.FileMode {
119 return 0
120 }
121
122 func (f *_escFile) ModTime() time.Time {
123 return time.Unix(f.modtime, 0)
124 }
125
126 func (f *_escFile) IsDir() bool {
127 return f.isDir
128 }
129
130 func (f *_escFile) Sys() interface{} {
131 return f
132 }
133
134
135
136 func FS(useLocal bool) http.FileSystem {
137 if useLocal {
138 return _escLocal
139 }
140 return _escStatic
141 }
142
143
144
145 func Dir(useLocal bool, name string) http.FileSystem {
146 if useLocal {
147 return _escDirectory{fs: _escLocal, name: name}
148 }
149 return _escDirectory{fs: _escStatic, name: name}
150 }
151
152
153
154 func FSByte(useLocal bool, name string) ([]byte, error) {
155 if useLocal {
156 f, err := _escLocal.Open(name)
157 if err != nil {
158 return nil, err
159 }
160 b, err := ioutil.ReadAll(f)
161 _ = f.Close()
162 return b, err
163 }
164 f, err := _escStatic.prepare(name)
165 if err != nil {
166 return nil, err
167 }
168 return f.data, nil
169 }
170
171
172 func FSMustByte(useLocal bool, name string) []byte {
173 b, err := FSByte(useLocal, name)
174 if err != nil {
175 panic(err)
176 }
177 return b
178 }
179
180
181 func FSString(useLocal bool, name string) (string, error) {
182 b, err := FSByte(useLocal, name)
183 return string(b), err
184 }
185
186
187 func FSMustString(useLocal bool, name string) string {
188 return string(FSMustByte(useLocal, name))
189 }
190
191 var _escData = map[string]*_escFile{
192
193 "/public/opencensus.css": {
194 local: "public/opencensus.css",
195 size: 0,
196 modtime: 1519153040,
197 compressed: `
198 H4sIAAAAAAAC/wEAAP//AAAAAAAAAAA=
199 `,
200 },
201
202 "/templates/footer.html": {
203 local: "templates/footer.html",
204 size: 16,
205 modtime: 1519153248,
206 compressed: `
207 H4sIAAAAAAAC/7LRT8pPqbTjstHPKMnNseMCBAAA//8ATCBFEAAAAA==
208 `,
209 },
210
211 "/templates/header.html": {
212 local: "templates/header.html",
213 size: 523,
214 modtime: 1519164535,
215 compressed: `
216 H4sIAAAAAAAC/5TRv07rMBQG8D1P4ev1qvat7oKQEwZgYEAwdGF0nZP4UP+JfE6oqqrvjkyKBGIpky0f
217 +6fP+syfu6fbzcvzvfAcQ9eYuohg09hKSLIzHmzfNUIIYSKwFc7bQsCtnHlYXcnziJEDdMej2tTN6WT0
218 crJMA6adKBBaST4XdjMLdDlJ4QsMrdR6v9+rPEFykGgmhVkP9q1eUeiy1D8ZPgQgD8CfxjRvAzr9BXFE
219 F730zBNdaz3kxKTGnMcAdkJSLkddM9wMNmI4tI+WoaANfx9cTiR/QbvcgxqBYx/q39bqv/qn45lTmHoc
220 82rCtFMR00fwM06u4MSihwGKoOIuJSvzSrIzehG6xuilSLPN/aHWvP7Wll93zXsAAAD//6iqQ1ULAgAA
221 `,
222 },
223
224 "/templates/rpcz.html": {
225 local: "templates/rpcz.html",
226 size: 2626,
227 modtime: 1519164559,
228 compressed: `
229 H4sIAAAAAAAC/+yW3WrbMBTH7/0UwmUjYyxJU3o1W1C6sQ4WNrq+gCwdfzBFMtJx9+Hl3cex3DhNCrOz
230 XfbGxFZ+5/8D+Ry5bZ0wBbD5VxT4wdmm9tttlNQ8QZFpYFkhrbYuPQMAyHP2vVJYpufL5QueoGNCV4VJ
231 JRgExxNUPMmtQearX5C+XvG2nb+rHEisrNlukwUt8mRB/1ugowuF8GRR8+ggMD7L8/wSIGa5ExtIM/uD
232 SdDa10JWpkiX3V0tlKK7FY8ixhgjp6ECAFwqiHm3FJZLCi2DKnnsLzGphfdprM9jJi0lmfSCX9vG4FTo
233 6r5gWiAY+ZPNNv7VVP5WILCZq+ViOvvR1A2y2bfsBPZzg6fD752zzndU2Aza47H70r9KGnLka8DSql38
234 S5P5+u3x9Vgr1HBVUSJfV2bel3i8cOOefn5ncf6c+Zz5XzKfaADyGLrlYn9UvlnxB52DERlFw4Q2oval
235 RRrQDyX3zBVPMhq4oXlo2mZHjXvcyqrXjzv/mAp0A29dmQbht6TfVGscdWMbN5W5syj0I2ik59V98SmM
236 2F5240elDlynO5kKwjtspO3tl2sa6r2qEwijYnusM50KBdE9aqRqd4DsySqBYnT2Du6UT0OD+AE7Uj6c
237 YKfaD/R0/YH9F/9wiE5uv4BN7L8A/a0BwxxqWzCKPg37b7bdgz8BAAD//6NjPmJCCgAA
238 `,
239 },
240
241 "/templates/summary.html": {
242 local: "templates/summary.html",
243 size: 1619,
244 modtime: 1519164559,
245 compressed: `
246 H4sIAAAAAAAC/6yVPW/bMBCG9/yKg2p4qu2kW12JRQtkCzok3YoOlHSWBdMngaSc2iz/e8EP+Stqi8Re
247 DIo63t3zvjwr1TwXCEpvBWZJ3sgS5US1vKipmsNtwm4AAFItwyI8lFA0QrWcsjvgoq4oE7jQLM3ZU8sJ
248 vvE1prOcpTNdnhxjY8pV+yn8/j5+8KFDiZMCSaNMXPLHjqim6i2pB5v/OFDjgWukYgtPfN0KVFerNcRz
249 L2Ujhyuls17xv0t/pcbelsYYyalCmEbBvnbFCrVzXlmb6uU/wX8YM7X2Z0ReMmOQSmuviRIENGbEYZ7B
250 9LvkBap7KtumJm2teyNqWin/9sGt/GaAGsnmuaYSf733Sx/z2DyHkAmMiK/RbzreuFkvADdIh7NOBrkf
251 LF6sKtl0VM7hHSImjlko9EGBHyZRAUdvTMzdD8b/9IgtRKijVC/k57CUuMgSp421n3dOOgeUGePBrB3v
252 9LbF7NY1Of1S6HrjG+HsUMr1ft7wIXIfdUb1aoa9Ib0bGy66IH28d07ACxjvxjvV5X5pzCj65rhDpSPs
253 /o6e0J9Pge+G+dv98tClYlxs6IcDbPDW/wGpE8cGfB2Iiij9kHnIdOY/JezmTwAAAP//Dz6TJ1MGAAA=
254 `,
255 },
256
257 "/templates/traces.html": {
258 local: "templates/traces.html",
259 size: 420,
260 modtime: 1519164578,
261 compressed: `
262 H4sIAAAAAAAC/4yQsU70MBCEez/FKtIv3RW/w6WgOIw7kGgoDiRqO14gwnGM1xEgs++OnKMA5Qq2ssYz
263 I82nolZW30UT4NaMuIdSZH0wg2qtVm3UQkVd1XlkhgO+zkiZvj8SavHwjAFO35U3kdDBhrDfiv9/PFFK
264 MuEJQR6mN2IuJaYh5Edo/nXn1MBmCA7fQV4P6B3B2ZYZfnh23dqzO3p+i12tlp85mR4HxyxKweCYVbvs
265 UjYt25UFyh8eL5t+8lPaWz/jRaPva+zGVUowogkEZMbo0UE6MpKiIlinTf9yMh6mvKpYMH8FAAD//yQs
266 JUakAQAA
267 `,
268 },
269
270 "/": {
271 isDir: true,
272 local: "",
273 },
274
275 "/public": {
276 isDir: true,
277 local: "public",
278 },
279
280 "/templates": {
281 isDir: true,
282 local: "templates",
283 },
284 }
285
View as plain text