xframelib 0.5.8 → 0.6.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 +118 -115
- package/dist/api/Token.d.ts +2 -7
- package/dist/api/User.d.ts +9 -5
- package/dist/controls/layoutcontainer/LayoutManager.d.ts +1 -2
- package/dist/controls/layoutcontainer/index.d.ts +1 -1
- package/dist/core/IModel.d.ts +0 -5
- package/dist/core/MsgHelper.d.ts +1 -0
- package/dist/index.cjs +13 -8
- package/dist/index.css +31 -31
- package/dist/index.js +13 -8
- package/dist/model/Config.d.ts +19 -11
- package/dist/model/Constants.d.ts +6 -2
- package/dist/model/IRole.d.ts +4 -0
- package/dist/model/{Token.d.ts → IUserModel.d.ts} +18 -21
- package/dist/model/index.d.ts +2 -1
- package/dist/permission/RoleSysRightHelper.d.ts +27 -0
- package/dist/permission/filter.d.ts +15 -8
- package/dist/permission/index.d.ts +1 -0
- package/dist/permission/right.d.ts +1 -1
- package/dist/public/mitm.html +180 -180
- package/dist/public/sw.js +128 -128
- package/dist/utils/Storage.d.ts +10 -1
- package/dist/utils/TokenHelper.d.ts +1 -1
- package/dist/utils/XXTEA.d.ts +15 -0
- package/dist/utils/index.d.ts +1 -0
- package/package.json +4 -4
package/dist/public/sw.js
CHANGED
|
@@ -1,128 +1,128 @@
|
|
|
1
|
-
/* global self ReadableStream Response */
|
|
2
|
-
|
|
3
|
-
self.addEventListener('install', () => {
|
|
4
|
-
self.skipWaiting()
|
|
5
|
-
})
|
|
6
|
-
|
|
7
|
-
self.addEventListener('activate', event => {
|
|
8
|
-
event.waitUntil(self.clients.claim())
|
|
9
|
-
})
|
|
10
|
-
|
|
11
|
-
const map = new Map()
|
|
12
|
-
|
|
13
|
-
// This should be called once per download
|
|
14
|
-
// Each event has a dataChannel that the data will be piped through
|
|
15
|
-
self.onmessage = event => {
|
|
16
|
-
// We send a heartbeat every x secound to keep the
|
|
17
|
-
// service worker alive if a transferable stream is not sent
|
|
18
|
-
if (event.data === 'ping') {
|
|
19
|
-
return
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
const data = event.data
|
|
23
|
-
const downloadUrl = data.url || self.registration.scope + Math.random() + '/' + (typeof data === 'string' ? data : data.filename)
|
|
24
|
-
const port = event.ports[0]
|
|
25
|
-
const metadata = new Array(3) // [stream, data, port]
|
|
26
|
-
|
|
27
|
-
metadata[1] = data
|
|
28
|
-
metadata[2] = port
|
|
29
|
-
|
|
30
|
-
// Note to self:
|
|
31
|
-
// old streamsaver v1.2.0 might still use `readableStream`...
|
|
32
|
-
// but v2.0.0 will always transfer the stream throught MessageChannel #94
|
|
33
|
-
if (event.data.readableStream) {
|
|
34
|
-
metadata[0] = event.data.readableStream
|
|
35
|
-
} else if (event.data.transferringReadable) {
|
|
36
|
-
port.onmessage = evt => {
|
|
37
|
-
port.onmessage = null
|
|
38
|
-
metadata[0] = evt.data.readableStream
|
|
39
|
-
}
|
|
40
|
-
} else {
|
|
41
|
-
metadata[0] = createStream(port)
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
map.set(downloadUrl, metadata)
|
|
45
|
-
port.postMessage({ download: downloadUrl })
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
function createStream (port) {
|
|
49
|
-
// ReadableStream is only supported by chrome 52
|
|
50
|
-
return new ReadableStream({
|
|
51
|
-
start (controller) {
|
|
52
|
-
// When we receive data on the messageChannel, we write
|
|
53
|
-
port.onmessage = ({ data }) => {
|
|
54
|
-
if (data === 'end') {
|
|
55
|
-
return controller.close()
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
if (data === 'abort') {
|
|
59
|
-
controller.error('Aborted the download')
|
|
60
|
-
return
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
controller.enqueue(data)
|
|
64
|
-
}
|
|
65
|
-
},
|
|
66
|
-
cancel () {
|
|
67
|
-
console.log('user aborted')
|
|
68
|
-
}
|
|
69
|
-
})
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
self.onfetch = event => {
|
|
73
|
-
const url = event.request.url
|
|
74
|
-
|
|
75
|
-
// this only works for Firefox
|
|
76
|
-
if (url.endsWith('/ping')) {
|
|
77
|
-
return event.respondWith(new Response('pong'))
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const hijacke = map.get(url)
|
|
81
|
-
|
|
82
|
-
if (!hijacke) return null
|
|
83
|
-
|
|
84
|
-
const [ stream, data, port ] = hijacke
|
|
85
|
-
|
|
86
|
-
map.delete(url)
|
|
87
|
-
|
|
88
|
-
// Not comfortable letting any user control all headers
|
|
89
|
-
// so we only copy over the length & disposition
|
|
90
|
-
const responseHeaders = new Headers({
|
|
91
|
-
'Content-Type': 'application/octet-stream; charset=utf-8',
|
|
92
|
-
|
|
93
|
-
// To be on the safe side, The link can be opened in a iframe.
|
|
94
|
-
// but octet-stream should stop it.
|
|
95
|
-
'Content-Security-Policy': "default-src 'none'",
|
|
96
|
-
'X-Content-Security-Policy': "default-src 'none'",
|
|
97
|
-
'X-WebKit-CSP': "default-src 'none'",
|
|
98
|
-
'X-XSS-Protection': '1; mode=block'
|
|
99
|
-
})
|
|
100
|
-
|
|
101
|
-
let headers = new Headers(data.headers || {})
|
|
102
|
-
|
|
103
|
-
if (headers.has('Content-Length')) {
|
|
104
|
-
responseHeaders.set('Content-Length', headers.get('Content-Length'))
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
if (headers.has('Content-Disposition')) {
|
|
108
|
-
responseHeaders.set('Content-Disposition', headers.get('Content-Disposition'))
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// data, data.filename and size should not be used anymore
|
|
112
|
-
if (data.size) {
|
|
113
|
-
console.warn('Depricated')
|
|
114
|
-
responseHeaders.set('Content-Length', data.size)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
let fileName = typeof data === 'string' ? data : data.filename
|
|
118
|
-
if (fileName) {
|
|
119
|
-
console.warn('Depricated')
|
|
120
|
-
// Make filename RFC5987 compatible
|
|
121
|
-
fileName = encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\*/g, '%2A')
|
|
122
|
-
responseHeaders.set('Content-Disposition', "attachment; filename*=UTF-8''" + fileName)
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
event.respondWith(new Response(stream, { headers: responseHeaders }))
|
|
126
|
-
|
|
127
|
-
port.postMessage({ debug: 'Download started' })
|
|
128
|
-
}
|
|
1
|
+
/* global self ReadableStream Response */
|
|
2
|
+
|
|
3
|
+
self.addEventListener('install', () => {
|
|
4
|
+
self.skipWaiting()
|
|
5
|
+
})
|
|
6
|
+
|
|
7
|
+
self.addEventListener('activate', event => {
|
|
8
|
+
event.waitUntil(self.clients.claim())
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
const map = new Map()
|
|
12
|
+
|
|
13
|
+
// This should be called once per download
|
|
14
|
+
// Each event has a dataChannel that the data will be piped through
|
|
15
|
+
self.onmessage = event => {
|
|
16
|
+
// We send a heartbeat every x secound to keep the
|
|
17
|
+
// service worker alive if a transferable stream is not sent
|
|
18
|
+
if (event.data === 'ping') {
|
|
19
|
+
return
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const data = event.data
|
|
23
|
+
const downloadUrl = data.url || self.registration.scope + Math.random() + '/' + (typeof data === 'string' ? data : data.filename)
|
|
24
|
+
const port = event.ports[0]
|
|
25
|
+
const metadata = new Array(3) // [stream, data, port]
|
|
26
|
+
|
|
27
|
+
metadata[1] = data
|
|
28
|
+
metadata[2] = port
|
|
29
|
+
|
|
30
|
+
// Note to self:
|
|
31
|
+
// old streamsaver v1.2.0 might still use `readableStream`...
|
|
32
|
+
// but v2.0.0 will always transfer the stream throught MessageChannel #94
|
|
33
|
+
if (event.data.readableStream) {
|
|
34
|
+
metadata[0] = event.data.readableStream
|
|
35
|
+
} else if (event.data.transferringReadable) {
|
|
36
|
+
port.onmessage = evt => {
|
|
37
|
+
port.onmessage = null
|
|
38
|
+
metadata[0] = evt.data.readableStream
|
|
39
|
+
}
|
|
40
|
+
} else {
|
|
41
|
+
metadata[0] = createStream(port)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
map.set(downloadUrl, metadata)
|
|
45
|
+
port.postMessage({ download: downloadUrl })
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function createStream (port) {
|
|
49
|
+
// ReadableStream is only supported by chrome 52
|
|
50
|
+
return new ReadableStream({
|
|
51
|
+
start (controller) {
|
|
52
|
+
// When we receive data on the messageChannel, we write
|
|
53
|
+
port.onmessage = ({ data }) => {
|
|
54
|
+
if (data === 'end') {
|
|
55
|
+
return controller.close()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (data === 'abort') {
|
|
59
|
+
controller.error('Aborted the download')
|
|
60
|
+
return
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
controller.enqueue(data)
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
cancel () {
|
|
67
|
+
console.log('user aborted')
|
|
68
|
+
}
|
|
69
|
+
})
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
self.onfetch = event => {
|
|
73
|
+
const url = event.request.url
|
|
74
|
+
|
|
75
|
+
// this only works for Firefox
|
|
76
|
+
if (url.endsWith('/ping')) {
|
|
77
|
+
return event.respondWith(new Response('pong'))
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const hijacke = map.get(url)
|
|
81
|
+
|
|
82
|
+
if (!hijacke) return null
|
|
83
|
+
|
|
84
|
+
const [ stream, data, port ] = hijacke
|
|
85
|
+
|
|
86
|
+
map.delete(url)
|
|
87
|
+
|
|
88
|
+
// Not comfortable letting any user control all headers
|
|
89
|
+
// so we only copy over the length & disposition
|
|
90
|
+
const responseHeaders = new Headers({
|
|
91
|
+
'Content-Type': 'application/octet-stream; charset=utf-8',
|
|
92
|
+
|
|
93
|
+
// To be on the safe side, The link can be opened in a iframe.
|
|
94
|
+
// but octet-stream should stop it.
|
|
95
|
+
'Content-Security-Policy': "default-src 'none'",
|
|
96
|
+
'X-Content-Security-Policy': "default-src 'none'",
|
|
97
|
+
'X-WebKit-CSP': "default-src 'none'",
|
|
98
|
+
'X-XSS-Protection': '1; mode=block'
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
let headers = new Headers(data.headers || {})
|
|
102
|
+
|
|
103
|
+
if (headers.has('Content-Length')) {
|
|
104
|
+
responseHeaders.set('Content-Length', headers.get('Content-Length'))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (headers.has('Content-Disposition')) {
|
|
108
|
+
responseHeaders.set('Content-Disposition', headers.get('Content-Disposition'))
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// data, data.filename and size should not be used anymore
|
|
112
|
+
if (data.size) {
|
|
113
|
+
console.warn('Depricated')
|
|
114
|
+
responseHeaders.set('Content-Length', data.size)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
let fileName = typeof data === 'string' ? data : data.filename
|
|
118
|
+
if (fileName) {
|
|
119
|
+
console.warn('Depricated')
|
|
120
|
+
// Make filename RFC5987 compatible
|
|
121
|
+
fileName = encodeURIComponent(fileName).replace(/['()]/g, escape).replace(/\*/g, '%2A')
|
|
122
|
+
responseHeaders.set('Content-Disposition', "attachment; filename*=UTF-8''" + fileName)
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
event.respondWith(new Response(stream, { headers: responseHeaders }))
|
|
126
|
+
|
|
127
|
+
port.postMessage({ debug: 'Download started' })
|
|
128
|
+
}
|
package/dist/utils/Storage.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ declare class StorageHelper {
|
|
|
10
10
|
* @description 设置缓存
|
|
11
11
|
* @param {string} key 缓存键
|
|
12
12
|
* @param {*} value 缓存值
|
|
13
|
-
* @param expire
|
|
13
|
+
* @param expire 超时时间为秒
|
|
14
14
|
*/
|
|
15
15
|
set(key: string, value: any, expire?: number | null): void;
|
|
16
16
|
/**
|
|
@@ -19,6 +19,15 @@ declare class StorageHelper {
|
|
|
19
19
|
* @param {*=} def 默认值
|
|
20
20
|
*/
|
|
21
21
|
get(key: string, def?: any): any;
|
|
22
|
+
/**
|
|
23
|
+
* 获取存储对象,带expire属性
|
|
24
|
+
* 返回:
|
|
25
|
+
* {
|
|
26
|
+
* value:any,
|
|
27
|
+
* expire:null|Time
|
|
28
|
+
* }
|
|
29
|
+
*/
|
|
30
|
+
getJsonObject(key: string): any;
|
|
22
31
|
/**
|
|
23
32
|
* 从缓存删除某项
|
|
24
33
|
* @param {string} key
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare function toBytes(str: any): Uint8Array;
|
|
2
|
+
declare function toString(bytes: any): string;
|
|
3
|
+
declare function encrypt(data: any, key: any): any;
|
|
4
|
+
declare function encryptToString(data: any, key: any): string;
|
|
5
|
+
declare function decrypt(data: any, key: any): any;
|
|
6
|
+
declare function decryptToString(data: any, key: any): string;
|
|
7
|
+
declare const XXTEA: {
|
|
8
|
+
toBytes: typeof toBytes;
|
|
9
|
+
toString: typeof toString;
|
|
10
|
+
encrypt: typeof encrypt;
|
|
11
|
+
encryptToString: typeof encryptToString;
|
|
12
|
+
decrypt: typeof decrypt;
|
|
13
|
+
decryptToString: typeof decryptToString;
|
|
14
|
+
};
|
|
15
|
+
export default XXTEA;
|
package/dist/utils/index.d.ts
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xframelib",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
4
|
"description": "积累的前端开发基础库",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"common": "dist/index.cjs",
|
|
7
7
|
"typings": "dist/index.d.ts",
|
|
8
8
|
"scripts": {
|
|
9
|
-
"dev": "vite --port
|
|
9
|
+
"dev": "vite --port 8099",
|
|
10
10
|
"build": "vite build",
|
|
11
11
|
"lib": "rollup -c ",
|
|
12
12
|
"serve": "vite preview",
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
"@hprose/io": "^3.0.10",
|
|
27
27
|
"@hprose/rpc-core": "^3.0.10",
|
|
28
28
|
"@hprose/rpc-html5": "^3.0.10",
|
|
29
|
+
"axios": "^0.26.1",
|
|
29
30
|
"localforage": "^1.10.0",
|
|
30
31
|
"spark-md5": "^3.0.2",
|
|
31
32
|
"streamsaver": "^2.0.6",
|
|
32
|
-
"xhr": "^2.6.0"
|
|
33
|
-
"axios": "^0.26.1"
|
|
33
|
+
"xhr": "^2.6.0"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@rollup/plugin-alias": "^3.1.9",
|