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
- | 缓存过期时间 | ❌<sup>1</sup> | ✔️ |
15
+ | 缓存过期时间 || ✔️ |
16
16
  | 缓存大小限制 | ❌ | ✔️ |
17
- | 预缓存 | ❌<sup>2</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.4',
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,
@@ -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 => new Promise(resolve => {
6
+ const pjaxUpdate = url => {
7
7
  const type = url.endsWith('js') ? 'script' : 'link'
8
- const name = type.length === 4 ? 'href' : 'src'
9
- for (let item of document.querySelectorAll(type)) {
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 resolve(true)
18
+ return true
18
19
  }
19
20
  }
20
- resolve(false)
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
- Promise.all(list.map(url => {
37
- if (url.endsWith('.js'))
38
- return pjaxUpdate(url)
39
- if (url.endsWith('.css'))
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
- const dbVersion = {
13
- write: (id) => caches.open(CACHE_NAME)
14
- .then(cache => cache.put(CTRL_PATH, new Response(JSON.stringify(id)))),
15
- /** @return {*} */
16
- read: () => caches.match(CTRL_PATH).then(response => response?.json())
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
- dbVersion.read()
24
- .then(async oldVersion => {
25
- if (oldVersion?.escape !== escape) {
26
- oldVersion.escape = escape
27
- await dbVersion.write(oldVersion)
28
- // noinspection JSUnresolvedVariable
29
- caches.delete(CACHE_NAME)
30
- .then(() => clients.matchAll())
31
- .then(list => list.forEach(client => client.postMessage({type: 'escape'})))
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
- // noinspection JSUnresolvedVariable
135
- event.source.postMessage({
136
- type: 'update',
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<{version, list, old}>}
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<any>}
179
+ * @return {Promise<{
180
+ * list?: VersionList,
181
+ * new: BrowserVersion,
182
+ * old: BrowserVersion
183
+ * }>}
180
184
  */
181
- const parseJson = json => dbVersion.read().then(oldVersion => {
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
- dbVersion.write(newVersion)
187
- return {version: newVersion, old: oldVersion}
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
- dbVersion.write(newVersion)
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, version: newVersion, old: oldVersion}
206
+ return {list, new: newVersion, old: oldVersion}
199
207
  })
200
- return fetchFile(new Request('/update.json'), false)
201
- .then(response => {
202
- if (checkResponse(response))
203
- return response.json().then(json =>
204
- parseJson(json).then(result => {
205
- const info = {version: result.version, old: result.old}
206
- if (result.list)
207
- return deleteCache(result.list)
208
- .then(list => list.length === 0 ? null : list)
209
- .then(list => Object.assign({list}, info))
210
- else return info
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swpp-backends",
3
- "version": "2.1.6",
3
+ "version": "2.1.7-beta.1",
4
4
  "main": "dist/index.js",
5
5
  "typings": "types/index.d.ts",
6
6
  "description": "Generate a powerful ServiceWorker for your website.",
@@ -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
+ }