swpp-backends 2.1.6 → 2.1.7-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md
CHANGED
|
@@ -12,9 +12,9 @@ swpp 生成的 SW 与其它插件的对比:
|
|
|
12
12
|
|:----------:|:-------------:|:------------:|
|
|
13
13
|
| 本地缓存 | ✔️ | ✔️ |
|
|
14
14
|
| 缓存增量更新 | ✔️ | ❌ |
|
|
15
|
-
| 缓存过期时间 |
|
|
15
|
+
| 缓存过期时间 | ❌ | ✔️ |
|
|
16
16
|
| 缓存大小限制 | ❌ | ✔️ |
|
|
17
|
-
| 预缓存 | ❌<sup>
|
|
17
|
+
| 预缓存 | ❌<sup>1</sup> | ✔️ |
|
|
18
18
|
| Request 篡改 | ✔️ | ❌ |
|
|
19
19
|
| URL 竞速 | ✔️ | ❌ |
|
|
20
20
|
| 备用 URL | ✔️ | ❌ |
|
|
@@ -30,8 +30,7 @@ swpp 生成的 SW 与其它插件的对比:
|
|
|
30
30
|
+ ✔️:支持
|
|
31
31
|
+ ❌:不支持
|
|
32
32
|
|
|
33
|
-
1.
|
|
34
|
-
2. 预缓存可以在前端实现,SW 实现这个功能容易拖延注册时间
|
|
33
|
+
1. 预缓存可以在前端实现,SW 实现这个功能容易拖延注册时间
|
|
35
34
|
|
|
36
35
|
目前支持的平台:
|
|
37
36
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
package/dist/index.js
CHANGED
|
@@ -10,7 +10,7 @@ const VersionAnalyzer_1 = require("./VersionAnalyzer");
|
|
|
10
10
|
const DomBuilder_1 = require("./DomBuilder");
|
|
11
11
|
// noinspection JSUnusedGlobalSymbols
|
|
12
12
|
exports.default = {
|
|
13
|
-
version: '2.1.
|
|
13
|
+
version: '2.1.7-beta.1',
|
|
14
14
|
cache: {
|
|
15
15
|
readEjectData: Utils_1.readEjectData, readUpdateJson: Variant_1.readUpdateJson,
|
|
16
16
|
readRules: Variant_1.readRules, readMergeVersionMap: Variant_1.readMergeVersionMap,
|
package/dist/resources/sw-dom.js
CHANGED
|
@@ -3,22 +3,22 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
|
3
3
|
const checkServiceWorker = () => 'serviceWorker' in navigator && navigator.serviceWorker.controller
|
|
4
4
|
/** 发送信息到 sw */
|
|
5
5
|
const postMessage2SW = type => navigator.serviceWorker.controller.postMessage(type)
|
|
6
|
-
const pjaxUpdate = url =>
|
|
6
|
+
const pjaxUpdate = url => {
|
|
7
7
|
const type = url.endsWith('js') ? 'script' : 'link'
|
|
8
|
-
const name = type
|
|
9
|
-
for (let item of document.
|
|
8
|
+
const name = type === 'link' ? 'href' : 'src'
|
|
9
|
+
for (let item of document.getElementsByTagName(type)) {
|
|
10
10
|
const itUrl = item[name]
|
|
11
11
|
if (url.length > itUrl ? url.endsWith(itUrl) : itUrl.endsWith(url)) {
|
|
12
12
|
const newEle = document.createElement(type)
|
|
13
13
|
const content = item.text || item.textContent || item.innerHTML || ''
|
|
14
|
+
// noinspection JSUnresolvedReference
|
|
14
15
|
Array.from(item.attributes).forEach(attr => newEle.setAttribute(attr.name, attr.value))
|
|
15
16
|
newEle.appendChild(document.createTextNode(content))
|
|
16
17
|
item.parentNode.replaceChildren(newEle, item)
|
|
17
|
-
return
|
|
18
|
+
return true
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
|
-
|
|
21
|
-
})
|
|
21
|
+
}
|
|
22
22
|
if (!checkServiceWorker()) return
|
|
23
23
|
if (sessionStorage.getItem('updated')) {
|
|
24
24
|
sessionStorage.removeItem('updated');
|
|
@@ -33,17 +33,12 @@ document.addEventListener('DOMContentLoaded', () => {
|
|
|
33
33
|
sessionStorage.setItem('updated', '1')
|
|
34
34
|
// noinspection JSUnresolvedVariable,JSUnresolvedFunction
|
|
35
35
|
if (window.Pjax?.isSupported()) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
return pjaxUpdate(url)
|
|
41
|
-
return Promise.resolve()
|
|
42
|
-
})).then(() => location.reload())
|
|
43
|
-
} else location.reload()
|
|
36
|
+
list.filter(url => /\.(js|css)$/.test(url))
|
|
37
|
+
.forEach(pjaxUpdate)
|
|
38
|
+
}
|
|
39
|
+
location.reload()
|
|
44
40
|
break
|
|
45
41
|
case 'escape':
|
|
46
|
-
sessionStorage.setItem('updated', '1')
|
|
47
42
|
location.reload()
|
|
48
43
|
break
|
|
49
44
|
}
|
|
@@ -5,32 +5,36 @@
|
|
|
5
5
|
const CACHE_NAME = '@$$[cacheName]'
|
|
6
6
|
/** 控制信息存储地址(必须以`/`结尾) */
|
|
7
7
|
const CTRL_PATH = 'https://id.v3/'
|
|
8
|
+
let escapeTrigger
|
|
8
9
|
|
|
9
10
|
// [insertion site] values
|
|
10
11
|
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
12
|
+
/**
|
|
13
|
+
* 读取本地版本号
|
|
14
|
+
* @return {Promise<BrowserVersion|undefined>}
|
|
15
|
+
*/
|
|
16
|
+
const readVersion = () => caches.match(CTRL_PATH).then(response => response?.json())
|
|
17
|
+
/**
|
|
18
|
+
* 写入版本号
|
|
19
|
+
* @param version {BrowserVersion}
|
|
20
|
+
* @return {Promise<void>}
|
|
21
|
+
*/
|
|
22
|
+
const writeVersion = version => caches.open(CACHE_NAME)
|
|
23
|
+
.then(cache => cache.put(CTRL_PATH, new Response(JSON.stringify(version))))
|
|
18
24
|
|
|
19
25
|
self.addEventListener('install', () => {
|
|
20
26
|
self.skipWaiting()
|
|
21
27
|
const escape = '@$$[escape]'
|
|
22
28
|
if (escape) {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
}
|
|
33
|
-
})
|
|
29
|
+
readVersion().then(oldVersion => {
|
|
30
|
+
if (oldVersion?.escape !== escape) {
|
|
31
|
+
escapeTrigger = true
|
|
32
|
+
// noinspection JSUnresolvedVariable
|
|
33
|
+
caches.delete(CACHE_NAME)
|
|
34
|
+
.then(() => clients.matchAll())
|
|
35
|
+
.then(list => list.forEach(client => client.postMessage({type: 'escape'})))
|
|
36
|
+
}
|
|
37
|
+
})
|
|
34
38
|
}
|
|
35
39
|
})
|
|
36
40
|
|
|
@@ -130,14 +134,10 @@
|
|
|
130
134
|
self.addEventListener('message', event => {
|
|
131
135
|
// [debug message]
|
|
132
136
|
if (event.data === 'update')
|
|
133
|
-
updateJson().then(info =>
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
update: info.list,
|
|
138
|
-
version: info.version,
|
|
139
|
-
old: info.old
|
|
140
|
-
})
|
|
137
|
+
updateJson().then(info => {
|
|
138
|
+
info.type = 'update'
|
|
139
|
+
event.source.postMessage(info)
|
|
140
|
+
}
|
|
141
141
|
)
|
|
142
142
|
})
|
|
143
143
|
|
|
@@ -155,9 +155,9 @@
|
|
|
155
155
|
|
|
156
156
|
/**
|
|
157
157
|
* 根据JSON删除缓存
|
|
158
|
-
* @returns {Promise<
|
|
158
|
+
* @returns {Promise<UpdateInfo>}
|
|
159
159
|
*/
|
|
160
|
-
const updateJson = () => {
|
|
160
|
+
const updateJson = async () => {
|
|
161
161
|
/**
|
|
162
162
|
* 解析elements,并把结果输出到list中
|
|
163
163
|
* @return boolean 是否刷新全站缓存
|
|
@@ -176,42 +176,46 @@
|
|
|
176
176
|
}
|
|
177
177
|
/**
|
|
178
178
|
* 解析字符串
|
|
179
|
-
* @return {Promise<
|
|
179
|
+
* @return {Promise<{
|
|
180
|
+
* list?: VersionList,
|
|
181
|
+
* new: BrowserVersion,
|
|
182
|
+
* old: BrowserVersion
|
|
183
|
+
* }>}
|
|
180
184
|
*/
|
|
181
|
-
const parseJson = json =>
|
|
185
|
+
const parseJson = json => readVersion().then(oldVersion => {
|
|
182
186
|
const {info, global} = json
|
|
187
|
+
/** @type {BrowserVersion} */
|
|
183
188
|
const newVersion = {global, local: info[0].version, escape: oldVersion?.escape ?? 0}
|
|
184
|
-
|
|
185
|
-
if (!oldVersion) {
|
|
186
|
-
|
|
187
|
-
|
|
189
|
+
// 新用户和刚进行过逃逸操作的用户不进行更新操作
|
|
190
|
+
if (!oldVersion || escapeTrigger) {
|
|
191
|
+
// noinspection JSValidateTypes
|
|
192
|
+
newVersion.escape = '@$$[escape]'
|
|
193
|
+
escapeTrigger = false
|
|
194
|
+
writeVersion(newVersion)
|
|
195
|
+
return {new: newVersion, old: oldVersion}
|
|
188
196
|
}
|
|
189
197
|
let list = new VersionList()
|
|
190
198
|
let refresh = parseChange(list, info, oldVersion.local)
|
|
191
|
-
|
|
199
|
+
writeVersion(newVersion)
|
|
192
200
|
// [debug escape]
|
|
193
|
-
|
|
201
|
+
// 如果需要清理全站
|
|
194
202
|
if (refresh) {
|
|
195
203
|
if (global !== oldVersion.global) list.force = true
|
|
196
204
|
else list.refresh = true
|
|
197
205
|
}
|
|
198
|
-
return {list,
|
|
206
|
+
return {list, new: newVersion, old: oldVersion}
|
|
199
207
|
})
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
})
|
|
212
|
-
)
|
|
213
|
-
else throw `加载 update.json 时遇到异常,状态码:${response.status}`
|
|
214
|
-
})
|
|
208
|
+
const response = await fetchFile(new Request('/update.json'), false)
|
|
209
|
+
if (!checkResponse(response))
|
|
210
|
+
throw `加载 update.json 时遇到异常,状态码:${response.status}`
|
|
211
|
+
const json = await response.json()
|
|
212
|
+
const result = await parseJson(json)
|
|
213
|
+
if (result.list) {
|
|
214
|
+
const list = await deleteCache(result.list)
|
|
215
|
+
result.list = list?.length ? list : null
|
|
216
|
+
}
|
|
217
|
+
// noinspection JSValidateTypes
|
|
218
|
+
return result
|
|
215
219
|
}
|
|
216
220
|
|
|
217
221
|
/**
|
package/package.json
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
interface BrowserVersion {
|
|
2
|
+
/** 逃生门版本号 */
|
|
3
|
+
escape: number;
|
|
4
|
+
/** 静态版本号 */
|
|
5
|
+
global: number;
|
|
6
|
+
/** 动态版本号 */
|
|
7
|
+
local: number;
|
|
8
|
+
}
|
|
9
|
+
interface UpdateInfo {
|
|
10
|
+
/** 新的版本号 */
|
|
11
|
+
new: BrowserVersion;
|
|
12
|
+
/** 旧的版本号 */
|
|
13
|
+
old?: BrowserVersion;
|
|
14
|
+
/** 刷新的 URL 列表 */
|
|
15
|
+
list?: string[];
|
|
16
|
+
}
|