-
Notifications
You must be signed in to change notification settings - Fork 2
/
ui.js
141 lines (126 loc) · 4.23 KB
/
ui.js
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
var h = require('hscrpt')
var input_file = require('hyperfile')
var Progress = require('hyperprogress')
var u = require('./util')
var prog = Progress()
var SecureUrl = require('./fetch')
var human = require('human-time')
module.exports = function (appname, wb) {
document.body.appendChild(prog)
function nice_error(err, msg) {
if(err.name && err.message && err.stack)
return err
if('object' !== typeof err)
return new Error(msg+JSON.stringify(err))
}
function btn (label, action) {
return h('button', {onclick: action}, [label])
}
function kb (bytes) {
return (Math.round((bytes / 1024) * 100)/100) + 'k'
}
function logFail(err) {
if(err) throw prog.fail(err)
}
function handleQuota(err, data, id) {
if(err
&& /quota/i.test(err.name)
&& confirm ('adding: '+id+' exceedes quota, clear cache?')
) {
wb.prune(data.length || data.byteLength || 0, function (err) {
if(err) throw prog.fail(err)
wb.add(data, id, function (err) {
if(err) throw prog.fail(err)
wb.run(id, logFail)
})
})
}
else if(!err) wb.run(id, logFail)
else
throw prog.fail(err)
}
function clearHash (err) {
if(err) throw prog.fail(err)
else location.hash = location.hash.split('#').splice(2).join('#')
}
;(function redraw () {
//okay, check if the hash has a secure url in it first.
var url = location.hash.split('#').splice(1).shift()
var id = SecureUrl.isSecureUrl(url)
if(!id) url = null
wb.versions(function (err, log) {
if(err) throw prog.fail(err)
document.body.innerHTML = ''
//if we have a version ready, and there is no url provided, run it.
if(!wb.isInit()) {
//if there is no logged versions, run the url version
if(id && !log.length) {
wb.installAndRun(url, clearHash)
}
//if there is no url, run the log version
else if(log.length && !id)
wb.run(log[0].value, logFail)
//prompt if they want to upgrade to new url version.
else if(id && log.length) {
//if the url is the same as we would have run,
//then just run it.
if(log[0].value === id)
wb.run(log[0].value, clearHash)
else if(confirm('change version to:'+url))
wb.installAndRun(url, clearHash)
else
wb.run(log[0].value, logFail)
}
}
else
document.body.appendChild(
h('div', {classList: 'WebBoot'}, [
( !log.length
? h('h2', 'please enter secure-url or select file to run')
: h('ol', {classList: 'WebBoot__recent'}, log.map(function (v) {
return h('li', [
h('code', [v.value]),
h('label',
{ title: new Date(v.ts).toString() },
[ ' (loaded ', human(new Date(v.ts)), ') ']
),
h('div', [
btn('run', function () {
wb.run(v.value)
}),
btn('revert', function () {
wb.revert(v.ts, function (err) {
if(err) throw prog.fail(err)
redraw()
})
})
])
])
}))
),
//paste a secure url into this text input
h('input', {
placeholder: 'enter secure url',
onchange: function (ev) {
//else, download it. if that succeeds,
//add to store, if success, run.
//if that fails, offer to clean up, or fail.
//add to store, if success, run.
//this can fail from quota exceeded.
//check whether we have this already, if so, run it.
var url = ev.target.value
wb.install(url, handleQuota)
}
}),
//or select a local file to run
input_file(function (data) {
wb.add(data, function (err, id) {
if(err) console.log(err.name)
handleQuota(err, data, id)
})
})
])
)
})
})()
}