init
This commit is contained in:
parent
ce3a47d49e
commit
5fc4768e77
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
node_modules/
|
||||||
|
package-lock.json
|
35
README.md
35
README.md
@ -1,3 +1,36 @@
|
|||||||
# PCDN
|
# PCDN
|
||||||
|
|
||||||
P2P CDN
|
P2P CDN
|
||||||
|
|
||||||
|
|
||||||
|
持有资源变动时, 通知节点列表
|
||||||
|
获取一个资源时, 先查找拥有此资源的节点列表
|
||||||
|
|
||||||
|
增量列表
|
||||||
|
|
||||||
|
节点列表伺服器记录每个节点持有的资源,
|
||||||
|
假设有 ABCDE 节点在线, 当 E 节点请求资源 a,
|
||||||
|
向伺服器查询没有任何节点持有此资源, 则从 CDN 下载此资源, 并通知伺服器将持有此资源 48 h
|
||||||
|
如果此节点持有资源过多, 将主动过期部分资源
|
||||||
|
|
||||||
|
O1双向查询
|
||||||
|
获取和修改某个节点持有的所有资源
|
||||||
|
获取和修改持有某个资源的所有节点
|
||||||
|
节点的上线和下线状态变动
|
||||||
|
|
||||||
|
应用于大量用户在线的网站或游戏以及图床, 当然也可以存储网站本身的 JS 文件
|
||||||
|
|
||||||
|
|
||||||
|
### 安全
|
||||||
|
资源污染: 某些节点发放虚假资源(使用hash校验)
|
||||||
|
空壳节点: 某些节点上报资源却拒绝分享资源(节点可用性上报)
|
||||||
|
虚假上报: 可用节点报告为不可用, 不可用节点报告为可用(伺服器要求指定节点上报指定节点可用性)
|
||||||
|
|
||||||
|
|
||||||
|
### 节点
|
||||||
|
某终端连接 8 个节点, 查询某资源信息
|
||||||
|
8x8=64 节点
|
||||||
|
64x8=512 节点
|
||||||
|
|
||||||
|
建立连接后交换资源列表及过期时间
|
||||||
|
|
||||||
|
3
index.html
Normal file
3
index.html
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<title>PCDN</title>
|
||||||
|
<script src="./main.js"></script>
|
29
main.js
Normal file
29
main.js
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//export class Node {
|
||||||
|
// id: ''
|
||||||
|
// name: ''
|
||||||
|
// assets: new Map()
|
||||||
|
// get(name) {}
|
||||||
|
// set(name) {}
|
||||||
|
// del(name) {}
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//export const nodes = new Map() // 在线的节点
|
||||||
|
//export const assets = new Map() // 在线的资源
|
||||||
|
//
|
||||||
|
//// 示例: 查询持有某个资源的节点列表
|
||||||
|
//const list = query('xxx.jpg').map(item => 'node id')
|
||||||
|
//const 测速排序 = () => {}
|
||||||
|
//
|
||||||
|
//// 查询某个
|
||||||
|
//
|
||||||
|
//// 示例: 通过PCDN节点网络获取某个资源
|
||||||
|
//const pcdn = new PCDN({ server: '/pcdn' })
|
||||||
|
//pcdn.get('xxx.jpg').then(file => {})
|
||||||
|
|
||||||
|
if ('serviceWorker' in navigator) {
|
||||||
|
navigator.serviceWorker.register('/sw.js').then((registration) => {
|
||||||
|
console.log('Service Worker 注册成功: ', registration)
|
||||||
|
}).catch((error) => {
|
||||||
|
console.log('Service Worker 注册失败: ', error)
|
||||||
|
})
|
||||||
|
}
|
14
package.json
Normal file
14
package.json
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"name": "pcdn",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "P2P CDN",
|
||||||
|
"main": "index.js",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite --open"
|
||||||
|
},
|
||||||
|
"author": "satori.love",
|
||||||
|
"license": "GPL-3.0-only",
|
||||||
|
"devDependencies": {
|
||||||
|
"vite": "^5.2.12"
|
||||||
|
}
|
||||||
|
}
|
11
sw.js
Normal file
11
sw.js
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
self.addEventListener('install', (event) => {
|
||||||
|
console.log('Service Worker 安装')
|
||||||
|
})
|
||||||
|
|
||||||
|
self.addEventListener('activate', (event) => {
|
||||||
|
console.log('Service Worker 激活')
|
||||||
|
})
|
||||||
|
|
||||||
|
self.addEventListener('fetch', (event) => {
|
||||||
|
console.log('Fetch intercepted for:', event.request.url)
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user